在类模板中定义的友元函数。功能模板重定义错误

时间:2015-05-23 13:44:50

标签: c++ templates

以下是两个代码示例。第一个为类模板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

以下是我的问题:

  1. 为什么main()中的两个模板实例会导致函数模板重定义错误?根据我的理解,它们应该导致唯一的实例,因为模板参数不同。
  2. 如何在类体外部移动函数定义来解决错误?
  3. 错误示例:

    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;
    }
    

1 个答案:

答案 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];
};