模板类的模板友元函数
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);
这是一个函数模板,采用两个模板参数:T
和N
。
但是,在您的类中,您可以创建一个具有以下签名的函数模板作为好友:
template<typename T>
friend Matrix<N> operator* (const Matrix<N> &m1, const T &m2);
这只有一个模板参数:T
。N
在这里已修复。此友元声明还声明此函数模板。这是一个更好的匹配,但实际上没有定义,因此你会看到行为。
我认为你有两个选择。
删除
operator*
的命名空间范围声明,只需在Matrix
的定义中声明和定义友元operator*
。更改友元声明以匹配命名空间范围的声明:
template<typename T, int M> friend Matrix<M> operator* (const Matrix<M> &m1, const T &m2);
(1( 通常是更好的选择 - 不涉及在全局范围内添加更多operator*
,这对编译时间有好处。
相关文章:
- C++模板来检查友元函数的存在
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 未定义的类模板不会实例化以检查友元函数
- C++类中的友元函数有问题?
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 模板类中的模板友元函数
- C++ 17 个友元函数声明和内联命名空间
- 将派生类的构造函数声明为父类的友元
- 友元函数需要一个帮助程序函数
- 在基/派生类的成员函数/友元函数中派生* 到 Base* 的转换
- 模板类的非模板函数友元