以下是两个代码示例。第一个为类模板operator+()
定义Vector
,而第二个只声明函数,但将函数定义移到类体外。第一个示例导致以下错误:
main.cpp(4): error C2995:
'Vector<L,T> operator +(const Vector<L,T> &,const Vector<L,T> &)' :
function template has already been defined
以下是我的问题:
错误示例:
template<int L, typename T>
class Vector {
template<int L, typename T> friend
Vector<L, T> operator+(const Vector<L, T>& lhs, const Vector<L, T>& rhs) {
return Vector<L, T>();
}
private:
T data[L];
};
int main() {
Vector<42, double> v42d;
Vector<24, int> v24i;
return 0;
}
工作样本:
template<int L, typename T>
class Vector {
template<int L, typename T> friend
Vector<L, T> operator+(const Vector<L, T>& lhs, const Vector<L, T>& rhs);
private:
T data[L];
};
template<int L, typename T>
Vector<L, T> operator+(const Vector<L, T>& lhs, const Vector<L, T>& rhs) {
return Vector<L, T>();
}
int main() {
Vector<42, double> v42d;
Vector<24, int> v24i;
return 0;
}
答案 0 :(得分:3)
模板类型L和T已知,因此不需要重新引入。实际上,对于友元函数这样做会导致它们掩盖为类定义的那些。
这解决了它:
template<int L, typename T>
class Vector {
friend
Vector<L, T> operator+(const Vector<L, T>& lhs, const Vector<L, T>& rhs) {
return Vector<L, T>();
}
private:
T data[L];
};
相当于:
template<int L, typename T>
class Vector {
friend
Vector operator+(const Vector& lhs, const Vector& rhs) {
return Vector();
}
private:
T data[L];
};