Шаблонное распространение через несколько файлов

Оказывается, мне не нужно было ничего делать со встроенным фрагментом. Конечная точка смогла понять пространство имен по умолчанию для встроенных документов (но если кто-то захочет ответить на это, я не буду возражать).

Единственное изменение, которое мне нужно было сделать, чтобы ответить Майклу, было добавить объявление пространства имен в тег "envelope". (Ни в коем случае Мишель не мог знать, что для завершения процесса понадобилось другое пространство имен.)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fha="http://xmlns.oracle.com/F17CTOTALScorecard/F17CTOTALScorecard/F17CTOTALScorecard"
xmlns:client="http://xmlns.oracle.com/F17CTOTALScorecard/F17CTOTALScorecard/F17CTOTALScorecard"
xmlns:ns2="http://mismo.org/aus/" 
xmlns:ns1="http://xmlns.oracle.com/F17CTOTALScorecard/F17CTOTALScorecard/F17CTOTALScorecard">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/fha:TOTALRequest-Response-Keys">
    <soapenv:Envelope 
    	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    	xmlns:f17="http://xmlns.oracle.com/F17CTOTALScorecard/F17CTOTALScorecard/F17CTOTALScorecard"
	xmlns:fha="http://xmlns.oracle.com/F17CTOTALScorecard/F17CTOTALScorecard/F17CTOTALScorecard">
        <soapenv:Body>
            <xsl:apply-templates select="fha:TOTALRequest-Response/client:process"/>
        </soapenv:Body>
    </soapenv:Envelope>
</xsl:template>

<xsl:template match="client:*">
    <xsl:element name="fha:{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

22
задан Vicent Marti 30 August 2008 в 15:27
поделиться

3 ответа

там какие-либо общие рекомендации или обходные решения для организации или перераспределения шаблонных членских определений через несколько файлов?

Да; не делать.

спецификация C++ разрешает компилятору быть в состоянии "видеть" весь шаблон (определение объявления и ) при инстанцировании, и (из-за сложностей любой реализации), большинство компиляторов сохраняет это требование. Результат - то, что #inclusion любого шаблонного заголовка должен также #include любой и весь источник, требуемый инстанцировать шаблона.

самый легкий способ иметь дело с этим состоит в том, чтобы вывести все в заголовок, встроенный, где возможно, исключительный в случае необходимости.

, Если Вы действительно рассматриваете это как недопустимое оскорбление, общая опция состоит в том, чтобы разделить шаблон на обычную пару заголовка/реализации, и затем #include файл реализации в конце заголовка.

функция C++ "экспорта" может или не может обеспечить другое обходное решение. Функция плохо поддерживается и плохо определяется; хотя это в принципе должно разрешить некоторую раздельную компиляцию шаблонов, это не обязательно устраняет требование что компилятор быть в состоянии видеть все шаблонное тело.

26
ответ дан 29 November 2019 в 05:07
поделиться

Через сколько файлов? Если Вы просто хотите отделиться, определения классов от реализации тогда пробуют эта статья в часто задаваемых вопросах C++. Это о единственном способе, которым я знаю этого работы в данный момент, но некоторые IDE (CDT Eclipse, например) не свяжут этот метод правильно, и можно получить много ошибок. Однако при записи собственных make-файлов или использовании Visual C++ это всегда работало на меня:-)

5
ответ дан 29 November 2019 в 05:07
поделиться

Когда/если Ваш компилятор поддерживает C++ 0x, extern, ключевое слово может использоваться для разделения объявлений шаблона от определений.

См. здесь для краткого объяснения.

кроме того, разделите 6.3, "Разделительная Модель", из Шаблоны C++: полное руководство David Vandevoorde и Nicolai M. Josuttis описывает другие опции.

alt text

3
ответ дан 29 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: