2015-05-28 2 views
0

У меня есть класс шаблона, и когда им подножка программы она говоритошибка LNK2019: неразрешенный внешний символ

ошибка LNK2019: оператор неразрешенный внешний символ «класс станд :: basic_ostream> & __cdecl < < (класс станд :: basic_ostream> &, класс CSet &) "(?? 6 @ YAAAV? $ basic_ostream @ DU? $ char_traits @ D @ std @@@ std @@ AAV01 @ AAV? $ CSet @ H @@@ Z) ссылка на функцию" public: void __thiscall Меню :: menu (void) "(? menu @ Menu @@ QAEXXZ)

на любую структуру данных, которую я пытаюсь использовать, , если кто-нибудь может объяснить мне, почему перегрузка g функции печати делает эту ошибку, я буду рад услышать об этом.

template <class T> class CSet{ 
T* Array; 
int size; 
public: 
CSet() 
{ 
    Array = NULL; 
    size = 0; 
} 
CSet(CSet& other){ 
    size = other.size; 
    Array = new T[size]; 
    for (int i = 0; i < size; i++) 
     Array[i] = other.Array[i]; 
} 
friend ostream& operator <<(ostream& out, CSet& other); 
~CSet() 
{ 
    if (size > 0) 
     delete[] Array; 
} 
}; 


template <class T> ostream& operator <<(ostream& out, CSet<T>& other){ 
out << "("; 
for (int i = 0; i < other.size; i++){ 
    if (size>1) 
     out << other.Array[i] < ","; 
    else 
     out << other.Array[i]; 
} 
out << ")" << endl; 
return out; 
} 

ответ

3

friend декларация не объявляет шаблон функции, но отдельную функцию для каждого экземпляра шаблона класса. Следовательно, шаблон, который вы определяете, не совпадает с этими функциями, которые остаются неопределенными.

Есть два варианта исправить это.

Либо определить оператор friend внутри класса, а не только декларирует его там:

friend ostream& operator <<(ostream& out, CSet& other) { 
    // implementation 
} 

Или объявить шаблон функции перед определением класса:

template <class T> class CSet; 
template <class T> ostream& operator <<(ostream& out, CSet<T>&); 

и объявить шаблон будет друга:

friend ostream& operator << <T>(ostream& out, CSet&); 
          ^^^ 
+0

Спасибо, что это сработало – user4949421

Смежные вопросы