Использование шаблонной функции-члена не шаблонного класса: error LNK2001
class CRegistry
{
public:
.....
template <class T>
int SetKeyValue(CString sParameter, T tValue,);
.....
};
В классе создаем шаблон функции:
template <class T>
int CRegistry::SetKeyValue(CString sParameter, T tValue)
{
.....
}
Создаем объект класса и вызываем шаблонную функцию:
CRegistry cRegistry;
int lOpResult = cRegistry.SetKeyValue("Bla bla bla", 45);
При компоновке возникает ошибка: "error LNK2001: unresolved external symbol "public: int __thiscall
CRegistry::SetKeyValue(class CString,int)" (?SetKeyValue@CRegistry@@QAEHVCString@@H_N@Z)"
Почему? Или надо создавать обобщенный класс и для каждого типа данных создавать по экземпляру этого
класса?
Спасибо за помощь!
При компоновке возникает ошибка: "error LNK2001: unresolved external symbol "public: int __thiscall
CRegistry::SetKeyValue(class CString,int)" (?SetKeyValue@CRegistry@@QAEHVCString@@H_N@Z)"
Почему? Или надо создавать обобщенный класс и для каждого типа данных создавать по экземпляру этого
класса?
Спасибо за помощь!
У меня все построилось нормально.
Ты где определяешь метод?
Его нельзя определять в отдельном *.cpp.
Нужно в том файле, где у тебя объявлен класс.
В хидер я ничего не стал загонять, а сделал #include для .cpp. По крайней мере, шаблонные классы стали работать. А вот с шаблонной функцией нешаблонного класса - проблемы. Вот аналогичный, но консольный пример с ошибкой:
class CMy
{
public:
...
template <class T>
void MySwap(T& a, T& b);
...
};
template <class T>
void CMy::MySwap(T& a, T& b)
{
T c( a );
a = b;
b = c;
}
void main()
{
int i = 56, j = 90;
CMy my;
my.MySwap(i, j); // !!!
}
На строке "!!!" возникает ошибка: "error C2893: Failed to specialize function template 'void __thiscall CMy::MySwap(T &,T &)'"
Вот аналогичный, но консольный пример с ошибкой:
class CMy
{
public:
...
template <class T>
void MySwap(T& a, T& b);
...
};
template <class T>
void CMy::MySwap(T& a, T& b)
{
T c( a );
a = b;
b = c;
}
void main()
{
int i = 56, j = 90;
CMy my;
my.MySwap(i, j); // !!!
}
На строке "!!!" возникает ошибка: "error C2893: Failed to specialize function template 'void __thiscall CMy::MySwap(T &,T &)'"
если реализацию метода поместить в объявление класса, то все будет нормально (см. пример ниже). Правда, при большом размере метода возникают проблемы с читабельностью кода.
class CMy
{
public:
...
template <class T>
void MySwap(T& a, T& b){
T c( a );
a = b;
b = c;
}
...
};
Понял. Действительно, метод я определял в .cpp.
В хидер я ничего не стал загонять, а сделал #include для .cpp.
Это как?
#include "xxx.cpp" ???
Это неверно!
class CMy
{
public:
...
template <class T>
void MySwap(T& a, T& b);
...
};
template <class T>
void CMy::MySwap(T& a, T& b)
{
T c( a );
a = b;
b = c;
}
void main()
{
int i = 56, j = 90;
CMy my;
my.MySwap(i, j); // !!!
}
На строке "!!!" возникает ошибка: "error C2893: Failed to specialize function template 'void __thiscall CMy::MySwap(T &,T &)'"
У меня этот кусок нормально строиться. Он разнесен у тебя как-нибудь по файлам? Покажи как.
Какой компилятор используешьм (6 или 7)?
Это как?
#include "xxx.cpp" ???
Это неверно!
У меня этот кусок нормально строиться. Он разнесен у тебя как-нибудь по файлам? Покажи как.
Какой компилятор используешьм (6 или 7)?
1) MS VisualStudio 6.0 SP5
2) файл значения не имеет: там где класс объявляется, - главное реализацию метода поместить в декларацию класса (как in-line метод) (НЕ #include XXX.cpp !!!!!) :
class CMy
{
public:
...
template <class T>
void MySwap(T& a, T& b){
T c( a );
a = b;
b = c;
}
...
};
void main()
{
int i = 56, j = 90;
CMy my;
my.MySwap(i, j); // все OK
}
... главное реализацию метода поместить в декларацию класса (как in-line метод)
class CMy
{
public:
...
template <class T>
void MySwap(T& a, T& b){
T c( a );
a = b;
b = c;
}
...
};
}
А вот это совсем и не главное, это не имеет никакого значения для данного случия.
А вот это совсем и не главное, это не имеет никакого значения для данного случия.
Возможно, но в других реализациях линковщик выдает ошибку.
Если есть еще варианты, то интересно посмотреть пример, но именно с шаблоном метода в нешаблонном классе