spo*_*ang 1 c++ templates friend
如果我在模板类声明中定义了友元模板函数,如下所示,它可以编译.
#include <iostream>
template <typename T>
class X {
public:
X(int i) : n(i) {}
private:
T n;
template <typename U>
friend void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
};
int main()
{
X<int> x(1);
doStuff(x, 3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我移出doStuff()类decalaration 的定义,就在声明类之后X<>,如下,它就无法编译.
template <typename U>
template <typename T>
void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
以下代码也不是.
template <typename U, typename T>
void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
那么如何doStuff()在类声明之外定义模板函数呢?
提前致谢.
也许是这样的:
template <typename T>
class X {
public:
X(int i) : n(i) {}
private:
T n;
template <typename U, typename V>
friend void doStuff(const X<U>& x, const V& u);
};
template <typename U, typename V>
void doStuff(const X<U>& x, const V& u)
{
std::cout << (x.n + u) << std::endl;
}
int main()
{
X<int> x(1);
doStuff(x, 3);
X<double> y(1.0);
doStuff(y, 3.5);
}
Run Code Online (Sandbox Code Playgroud)