我有一个简单的类X,以及一组模板化的类Y< T,U>。我希望所有第一个模板化参数恰好是X的类Y成为X本身的朋友。以下希望能够传达我想要的东西,但是友元语句会产生编译错误。
template<typename T, typename U>
class Y {
};
class X {
public:
X(int value) : i(value) {}
const int& getI() const { return i; }
private:
int i;
template<class U> friend class Y<X,U>;
};
我不确定朋友声明的模板化是否允许(更不用说朋友声明的部分模板化)。有没有办法做到这一点?或者我是不是一个一个地列出了所有的朋友?
谢谢, 马特
答案 0 :(得分:5)
cppreference.com上的friend declaration page指定:
朋友声明不能引用部分专业化,而可以引用完全专业化
因此,正如chtz所说,您可以有一个非局部专业朋友。
编辑:
另请参阅有关stackoverflow的另一个答案:https://stackoverflow.com/a/11046918/5776353
答案 1 :(得分:4)
对于问题的非部分部分,语法为:
class X {
template<class T, class U> friend class Y;
};
我想,在大多数情况下,这应该足够了。
使用C ++ 11,您实际上可以成为模板化别名的朋友:
template<typename T, typename U>
class Y { };
class X {
public:
X(int value) : i(value) {}
const int& getI() const { return i; }
private:
int i;
template<class U> using YX = Y<X,U>;
template<class U> friend class YX;
};
然而,这似乎不起作用(我不确定上面的朋友声明是否有任何效果)。