Как я должен сделать эту функцию шаблона явной реализации для использования DLL? - PullRequest
1 голос
/ 09 ноября 2010

У меня есть следующий класс и шаблонная функция:

template <size_t num>
class String{
 public:
  char charArray[num];
};

template <size_t num,typename T>
void getString(String<num> & string,T number){
 cout <<string.charArray<<' '<<number<<'\n';
}

, затем я попытался выполнить явное создание экземпляра следующим образом, чтобы экспортировать это создание в DLL, но в конце концов обнаружил, что он не получилсоздавался вообще, так как я получил ошибку компоновщика неразрешенного внешнего символа от компоновщика в месте, где я собирался импортировать и использовать эту функцию (точная ошибка компоновщика: " неразрешенный внешний символ" __declspec (dllimport) void _ cdeclgetString <5> (класс String <5> &, беззнаковый символ) ( _imp _ ?? $ getString @ $ 04 @@ YAXAAV? $ String @ $ 04 @@ E @ Z) * ​​1007 * "), поскольку" num "былоне был указан в момент, когда я намеревался создать экземпляр, во-первых, я думал, что, возможно, из-за того, что String<num> & string будет реализован как указатель, следующий синтаксис был бы экземпляром, но, кажется, я ошибался.

template<size_t num> 
__declspec(dllexport) void getString(String<num> & string,unsigned char number);

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

Ответы [ 3 ]

4 голосов
/ 09 ноября 2010

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

Обязательные ссылки:

1 голос
/ 09 ноября 2010

Что это, это неправильный дизайн с самого начала. То, что я сделал, не является явной реализацией вообще, потому что даже для разных значений «size_t num» генерируются разные экземпляры функции, противоположные тому, что я думалпоначалу мой вид явного создания экземпляров невозможен с этим проектом.для правильного дизайна первым параметром функции должен быть массив, чтобы сделать возможным явное создание экземпляров для разных типов для "typename T".Правильный дизайн будет выглядеть следующим образом:

template <typename T>
void getString(char string[],T number){
 cout <<string<<' '<<number<<'\n';
}
template __declspec(dllexport) void getString(char string[],unsigned char number);
0 голосов
/ 09 ноября 2010

В вашем заголовке объявите:

template <size_t num,typename T>
void getString(String<num> & string,T number);

В вашем файле cpp определите:

template <>
void getString<42,int>(String<42,int> & string, int number){
  cout <<string.charArray<<' '<<number<<'\n';
}
...