not необходимо поместить реализацию в файл заголовка, см. альтернативное решение в конце этого ответа.
В любом случае причина, по которой ваш код не работает, что при создании экземпляра шаблона компилятор создает новый класс с заданным аргументом шаблона. Например:
template
struct Foo
{
T bar;
void doSomething(T param) {/* do stuff using T */}
};
// somewhere in a .cpp
Foo f;
При чтении этой строки компилятор создаст новый класс (назовем его FooInt
), что эквивалентно следующему:
struct FooInt
{
int bar;
void doSomething(int param) {/* do stuff using int */}
}
Следовательно, компилятор должен иметь доступ к реализации методов, чтобы создать экземпляр с аргументом шаблона (в данном случае int
). Если эти реализации не были в заголовке, они не были бы доступны, поэтому компилятор не смог бы создать экземпляр шаблона.
Общим решением для этого является запись объявления шаблона в заголовок файла, затем реализовать класс в файле реализации (например, .tpp) и включить этот файл реализации в конец заголовка.
// Foo.h
template
struct Foo
{
void doSomething(T param);
};
#include "Foo.tpp"
// Foo.tpp
template
void Foo::doSomething(T param)
{
//implementation
}
Таким образом, реализация по-прежнему отделена от объявления, но доступен компилятору.
Другое решение состоит в том, чтобы сохранить реализацию отдельно и явно создать все экземпляры шаблона, которые вам понадобятся:
// Foo.h
// no implementation
template struct Foo { ... };
//----------------------------------------
// Foo.cpp
// implementation of Foo's methods
// explicit instantiations
template class Foo;
template class Foo;
// You will only be able to use Foo with int or float
Если мое объяснение isn ' t достаточно ясно, вы можете взглянуть на C ++ Super-FAQ по этому вопросу .
Решение вопроса заключается в использовании следующего:
-replace '\ s \ s +'
Это удаляет все пробелы из текстового файла, и вы можете заменить на символ и разделите на том же персонаже, чтобы создать свой CSV.
Вы можете просто обновить рассчитанные свойства, поэтому замена используется только свойством Name
:
Get-WmiObject win32_share -ComputerName $PC |
Select-Object -Property @{Name="Server";Expression={ Вы можете просто обновить рассчитанные свойства, поэтому замена используется только свойством Name
:
[110] ..__Server}},Path,@{Name="Name";Expression={
Вы можете просто обновить рассчитанные свойства, поэтому замена используется только свойством Name
:
[110] ..Name.replace(" ","")}} |
Format-Table -AutoSize
.
Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
Sort-Object -Property path | ft @{Name="Server";Expression={ Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
Sort-Object -Property path | ft @{Name="Server";Expression={ Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
[111]
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.__Server}},@{Name="Path";Expression={"' Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
[111]
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.Path'"}},Name -autosize
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.__Server}},@{Name="Path";Expression={ Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
Sort-Object -Property path | ft @{Name="Server";Expression={ Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
[111]
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.__Server}},@{Name="Path";Expression={"' Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
[111]
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.Path'"}},Name -autosize
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.Path.replace(" ","")}},Name -autosize
Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
Sort-Object -Property path | ft @{Name="Server";Expression={ Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
[111]
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.__Server}},@{Name="Path";Expression={"' Вы уже используете вычисляемое свойство в столбцах. Используйте тот же путь для Пути.
[110] Но вы должны знать, что C:\MyPath
! = C:\My Path
. Чтобы использовать пути с пробелами, заключите их в "
или '
. > 'C:\My Path'
Чтобы заменить путь на путь в кавычках, вы можете использовать следующий код:
[111]
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.
.Path'"}},Name -autosize
Thx James C. для указания на использование .replace()
вместо .trim()
. Я забыл, что .trim()
работает только с пробелами в начале и конце строки, а .replace()
удаляет все пробелы.