2016-05-16 2 views
0

У меня есть два калиброванных перегруженный друг функции в моем Set классе, которые продолжают посылать назад ошибкунеопределенная ссылки на весь друг функцию

Templatedriver.cpp:(.text+0x2a0): undefined reference to `std::ostream& operator<< <int>(std::ostream&, Set<int> const&)' 

и

Templatedriver.cpp:(.text+0x2dd): undefined reference to `std::ostream& operator<< <int>(std::ostream&, Set<int> const&)' 

и так далее (просто изменяя выход для double, char и т. д.) Я искал это, и наиболее распространенный ответ здесь заключается в том, чтобы сделать объявление вперед, а затем объявить его как друга в классе, я сделал это и все еще получаю неопределенную ссылку

это мой опережающее объявление

template <class T> istream& operator>>(istream&, Set<T>&); 
template <class T> ostream& operator<<(ostream&, const Set<T>&); 

и я объявляю их в них в классе как таковой

template <class T> 
class Set { 

friend istream& operator>> <>(istream&, Set<T>&); 
template <class Y> */friend ostream& operator<< <>(ostream&, const Set<T>&); 
....//rest of class 
} 

и эти определения

template <class T> istream& operator>>(istream& is, Set<T>& S){ 
    S.input(); 
    return(is); 
} 


template <class T> ostream& operator<<(ostream& os, const Set<T>& S){ 
     S.display(); 
     return(os); 
} 

Theres несколько более перегруженные классы имейте проблемы с, но все равно проблема

+0

ли определения в файле заголовка? – immibis

+0

вопрос immibis важный. Если ваш экземпляр 'Set ' не может видеть реализации 'operator <<' и 'operator >>', то они никогда не получат экземпляр. – md5i

+0

нет, определения находятся в Set.cpp, если они находятся в файле заголовка? –

ответ

0

В Set, я думаю, что вы хотите использовать шаблонный друг заявление:

template <typename T> 
friend istream& operator>> (istream&, Set<T>&); 

Объявляет, что любая функция, которая соответствует после подстановки параметров шаблона является другим классом.

(Вы, возможно, чуть было, но я был смущен */ в коде. Достаточно сказать, что вы должны удалить <>.)

+0

ah damn Я хотел удалить это здесь, материал прямо перед */не должен быть там, и я сделал это в какой-то момент, и он не работал –

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