对所有朋友函数的未定义引用

时间:2016-05-16 01:33:19

标签: c++ templates overloading friend

我的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);   
}

还有一些重载的类我遇到了麻烦,但问题都是一样的

1 个答案:

答案 0 :(得分:0)

Set中,我认为你想使用模板化的朋友声明:

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

这声明在模板参数替换之后匹配的任何函数都是该类的朋友。

(你可能已经有了这个,但我对代码中的*/感到困惑。我只想说你应该删除<>。)