【发布时间】:2012-10-13 17:04:13
【问题描述】:
如果我在模板类声明里面定义友元模板函数,如下,就可以编译了。
#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;
}
但是如果我将doStuff()的定义移出类声明,就在类X<>的声明之后,如下,就无法编译了。
template <typename U>
template <typename T>
void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
下面的代码也没有。
template <typename U, typename T>
void doStuff(const X<T>& x, const U& u)
{
std::cout << (x.n + u) << std::endl;
}
那么我应该如何在类声明之外定义模板函数doStuff()呢?
提前致谢。
【问题讨论】:
-
我可以完成这项工作的唯一方法是使用封装 doStuff() 的朋友类。