请考虑以下代码:
class A {
class B {};
template <typename T>
friend class C;
};
template <typename T>
class C : A::B {};
int main() { C<int> c; }
它与GCC和Clang编译良好,但Visual C ++ 2010出错:
test.cc(11) : error C2248: 'A::B' : cannot access private class declared in class 'A'
它是Visual C ++中的错误还是我错过了什么?
答案 0 :(得分:2)
1998年标准和2011年标准都包含与14.5.3#4和14.5.4#3中相同的代码。
class X {
template<class T> friend struct A;
class Y { };
};
template<class T> struct A { X::Y ab; }; // OK
template<class T> struct A<T*> { X::Y ab; }; // OK
显然这是一个错误。
答案 1 :(得分:1)
是。这肯定是Visual C ++编译器中的一个错误。
脚注:GCC编译器编译好了。
答案 2 :(得分:0)
实际上,A::B
是A
私有的。
这可能意味着,但这是我的解释,我将不得不用标准中的段落来支持它,你不能在全局范围内引用A::B
,更不用说声明任何A::B
的子类了{{ 1}},也不能创建指向A::B
等的指针......
另一方面,X
可以访问A::B
,因此 it 可以声明它的子类:
class A {
class B {
};
template<typename T> friend class X;
template<typename T> friend class Y;
};
template<typename T> class X : public A::B{};
template<typename T>
class Y {
class B2 : public A::B {};
};
int main() {
X<int> x;
Y<int> y;
}
对于此代码段,Comeau并未告诉我Y
无法实例化。 VS2005也没有。