Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp
, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.
Была функция с ключевым словом export
, которая была предназначенный для отдельной компиляции. Функция export
устарела в C++11
и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export
. Отдельная компиляция невозможна в C++
или C++11
, но, возможно, в C++17
, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.
Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.
Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.
Поскольку ваш атрибут Name
следует сравнивать в режиме нечувствительности к регистру, я предлагаю что-то вроде этого:
[xml]$xml = @"
<Tag1>
<Tag2>
<file Name="file1.rdl" Path="folder34" />
<File Name="file2.rdl" Path="folder37" />
<File Name="file3.rdl" Path="folder34" />
<File Name="File4.rdl" Path="folder76" />
<File Name="file5.rdl" Path="folder37" />
</Tag2>
</Tag1>
"@
$AttribureReportName = "File4.rdl"
foreach ($item in ($xml.Tag1.Tag2.file | Where-Object { Поскольку ваш атрибут Name
следует сравнивать в режиме нечувствительности к регистру, я предлагаю что-то вроде этого:
[110].Name -eq $AttribureReportName})) {
$item.Path
}
Во-первых, это неправильно:
[xml]$XmlDocument = Get-Content "D:\Roshan\Testing\Test1.xml"
Не загружайте XML-файлы таким образом, это может вызвать проблемы с кодировкой. У синтаксических анализаторов XML есть продуманный механизм автоматического определения кодировки. В Get-Content
такого нет, поэтому есть большая вероятность, что файл XML загружен с неправильной кодировкой, а данные внутри повреждены.
Используйте синтаксический анализатор XML для загрузки файла.
$XmlDocument = New-Object xml
$XmlDocument.Load("D:\Roshan\Testing\Test1.xml")
После этого вы можете использовать XPath, чтобы выбрать нужный узел из файла. Это будет намного быстрее, чем писать любые циклы Powershell самостоятельно (Where-Object
также является циклом).
$File = $XmlDocument.SelectSingleNode("/Tag1/Tag2/File[@Name = 'File4.rdl']")
Write-Host $File.Path