最近在写C++。在为一个template class重载<<运算符的时候,碰到了许多问题。这些问题我想对于没有这方面经验的人都比较难以解决,或者解决了也不明白是怎么回事。
我在stackoverflow上找到一个回答,基本上讲得比较详细,大家可以去看~
具体解释可以看链接,下面只给出解决的三种途径:
1)(直接上代码)
template<typename T>
class test{
public:
template<typename U>
friend std::ostream& operator<< (std::ostream& os, const test<U>& ll);
/* other members */
};
template<typename U>
friend std::ostream& operator<< (std::ostream& os, const test<U>& ll){
/* definition */
}
2)
template<typename T>
class test{
public:
friend std::ostream& operator<< (std::ostream& os, const test& ll) { /* definition */ }
/* other members */
};
注意,这里的function definition必须是inline的。
3)
template<typename T> class test;
template<typename T> std::ostream& operator<< <T>(std::ostream& os, const test<T>& ll);
template<typename T>
class test{
public:
friend std::ostream& operator<< <T>(std::ostream& os, const test<T>& ll);
/* other members */
};
template<typename T>
std::ostream& operator<< (std::ostream& os, const test<T>& ll){
/* definition */
}
注意,这里必须在前面有declaration在前面。