朋友 类 的部分模板专业化?
partial template specialization for friend classes?
我有一个简单的 class X 和一组模板化的 classes Y。我希望第一个模板化参数恰好是 X 的所有 classes Y 成为 X 本身的朋友。下面希望传达我想要的,但是 friend 语句给出了编译错误。
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>;
};
我不确定是否允许友元语句模板化(更不用说友元语句的部分模板化了)。有没有办法做到这一点?还是我把所有的朋友都一一列出来了?
谢谢,
马特
对于你问题的非部分,语法是:
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;
};
但是,这似乎不起作用(我不确定上面的朋友声明是否有任何效果)。
cppreference.com 上的 friend declaration page 指定:
Friend declarations cannot refer to partial specializations, but can refer to full specializations
所以chtz说你可以有一个不偏科的朋友
编辑:
另请参阅 Whosebug 上的另一个答案:
我有一个简单的 class X 和一组模板化的 classes Y
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>;
};
我不确定是否允许友元语句模板化(更不用说友元语句的部分模板化了)。有没有办法做到这一点?还是我把所有的朋友都一一列出来了?
谢谢, 马特
对于你问题的非部分,语法是:
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;
};
但是,这似乎不起作用(我不确定上面的朋友声明是否有任何效果)。
cppreference.com 上的 friend declaration page 指定:
Friend declarations cannot refer to partial specializations, but can refer to full specializations
所以chtz说你可以有一个不偏科的朋友
编辑:
另请参阅 Whosebug 上的另一个答案: