繁体   English   中英

模板类的模板友好功能

[英]Template friend function of template class

我想知道如何创建类的函数朋友并在函数的模板参数包括但不限于类的模板参数的情况下定义类外的函数。

例如,我有以下模板类和模板友元函数:

template<int N>  class Matrix;
template<typename T, int N> Matrix<N> operator*(const Matrix<N> &m1, const T &m2);

// class definition
template<int N>
class Matrix{
  template<typename T>
  friend Matrix<N> operator* (const Matrix<N> &m1, const T &m2);
};

// friend function definition
template<typename T, int N> Matrix<N> operator*(const Matrix<N> &m1, const T &m2)
{
    return m1; // just as an example
}

如果我编译:

Matrix<3> m;
m * 1.0;

我会得到以下链接器错误:

test.cc:(.text+0x1c7): undefined reference to `Matrix<3> operator*<double>(Matrix<3> const&, double const&)'
collect2: error: ld returned 1 exit status

你的实物不匹配。

您的初始声明和后来的定义具有以下签名:

template<typename T, int N>
Matrix<N> operator*(const Matrix<N> &m1, const T &m2);

这是一个带有两个模板参数的函数模板: TN

但是,在您的班级中,您将具有此签名的功能模板作为朋友:

template<typename T>
friend Matrix<N> operator* (const Matrix<N> &m1, const T &m2);

这只有一个模板参数: T N固定在这里。 这个朋友声明也声明了这个函数模板。 这是一个更好的匹配,但实际上没有定义,因此您看到的行为。


我认为你有两种选择。

  1. 删除operator*的名称空间范围声明,并在Matrix的定义中声明和定义friended operator*

  2. 更改friend声明以匹配命名空间范围声明:

     template<typename T, int M> friend Matrix<M> operator* (const Matrix<M> &m1, const T &m2); 

(1)通常是更好的选择 - 不涉及在全局范围中添加更多operator* ,这对编译时有好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM