Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование шаблонной функции-члена не шаблонного класса: error LNK2001

321
17 ноября 2003 года
Doomych
124 / / 20.01.2000
Создаем класс:
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)"
Почему? Или надо создавать обобщенный класс и для каждого типа данных создавать по экземпляру этого

класса?

Спасибо за помощь!
3
17 ноября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
При компоновке возникает ошибка: "error LNK2001: unresolved external symbol "public: int __thiscall
CRegistry::SetKeyValue(class CString,int)" (?SetKeyValue@CRegistry@@QAEHVCString@@H_N@Z)"
Почему? Или надо создавать обобщенный класс и для каждого типа данных создавать по экземпляру этого
класса?
Спасибо за помощь!



У меня все построилось нормально.
Ты где определяешь метод?
Его нельзя определять в отдельном *.cpp.
Нужно в том файле, где у тебя объявлен класс.

321
18 ноября 2003 года
Doomych
124 / / 20.01.2000
Понял. Действительно, метод я определял в .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 &)'"
5.9K
18 ноября 2003 года
AMTiger
3 / / 18.11.2003
Цитата:
Originally posted by Doomych
Вот аналогичный, но консольный пример с ошибкой:

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;
}
...
};

3
18 ноября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
Понял. Действительно, метод я определял в .cpp.
В хидер я ничего не стал загонять, а сделал #include для .cpp.



Это как?
#include "xxx.cpp" ???
Это неверно!

Цитата:
Originally posted by Doomych

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)?

5.9K
18 ноября 2003 года
AMTiger
3 / / 18.11.2003
Цитата:
Originally posted by Green


Это как?
#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
}

3
18 ноября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AMTiger

... главное реализацию метода поместить в декларацию класса (как in-line метод)

class CMy
{
public:
...

template <class T>
void MySwap(T& a, T& b){
T c( a );
a = b;
b = c;
}

...
};
}



А вот это совсем и не главное, это не имеет никакого значения для данного случия.

5.9K
18 ноября 2003 года
AMTiger
3 / / 18.11.2003
Цитата:
Originally posted by Green


А вот это совсем и не главное, это не имеет никакого значения для данного случия.



Возможно, но в других реализациях линковщик выдает ошибку.

Если есть еще варианты, то интересно посмотреть пример, но именно с шаблоном метода в нешаблонном классе

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог