我有一个问题重载<<
流运算符,我没有找到解决办法:
template<class T, unsigned int TN>
class NVector
{
inline friend std::ostream& operator<< (
std::ostream &lhs, const NVector<T, TN> &rhs);
};
template<class T, unsigned int TN>
inline std::ostream& NVector<T, TN>::operator<<(
std::ostream &lhs, const NVector<T, TN> &rhs)
{
/* SOMETHING */
return lhs;
};
它产生以下错误消息:
警告:朋友宣言 '的std :: ostream的和运营商<<(STD :: ostream的和,常量NVector&)' 声明一个非模板函数[-Wnon模板,朋友]
错误: '的std :: ostream的和NVector ::运算符<<(STD :: ostream的和,常量NVector&)' 必须只有一个参数
如何解决这个问题?
非常感谢你。
有在你的代码两个不同的问题,第一个是在friend
的声明(如警告说清楚,也许不是那么清楚明白的)声明了一个非模板函数为好友。 也就是说,当你实例化模板NVector<int,5>
它声明的非模板函数std::ostream& operator<<(std::ostream&,NVector<int,5>)
为好友。 请注意,这是从宣布你为朋友提供的模板函数不同。
我建议你定义的类定义友元函数。 您可以在此了解更多关于这个答案 。
template <typename T, unsigned int TN>
class NVector {
friend std::ostream& operator<<( std::ostream& o, NVector const & v ) {
// code goes here
return o;
}
};
另外,您可以选择其他选项:
- 声明
operator<<
模板作为朋友(将授予访问任何与该模板的所有实例) - 声明该模板的一个特定实例为朋友(更麻烦写)或
- 避免友谊共提供公共
print( std::ostream& )
成员函数和非朋友模板调用它operator<<
。 我仍然选择交好非模板功能的提供的模板类中的定义。
第二个问题是,当你要定义的类左侧的说法之外的运营商,运营商是一个免费的功能 (未绑定到一个类),因此它不应该被限定:
template<class T, unsigned int TN>
inline std::ostream& operator<<(std::ostream &lhs, const NVector<T, TN> &rhs)
{
/* SOMETHING */
return lhs;
};