【发布时间】:2016-09-11 17:56:00
【问题描述】:
我的 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);
}
还有一些重载的类我遇到了麻烦,但都是同样的问题
【问题讨论】:
-
头文件中有定义吗?
-
immibis 的问题很重要。如果您的
Set<int>实例化看不到operator<<和operator>>实现,那么它们永远不会被实例化。 -
不,定义在Set.cpp中,那么它们应该在头文件中吗?
-
如果模板函数仅在该文件中使用,则它们应仅在实现文件 (cpp) 中定义。否则,它们需要在标题中。这是因为使用类型
X的文件需要模板定义来实例化适用于类型X的实例。 -
你的问题。定义必须在头文件中。这是stackoverflow.com/questions/495021/…的骗子
标签: c++ templates overloading friend