c ++模板似乎打破了访问说明符
下面的代码由于显而易见的原因不能编译,即Foo试图访问Bar的私有成员。 但是,如果您取消注释/注释标记的行,将Foo作为模板,它会编译并输出42.我在这里错过了什么? 为什么这个工作? 在我看来,它不应该。
谢谢你的帮助。
#include <iostream>
class Bar {
private:
static const int x = 42;
};
//template <int> // uncomment me
struct Foo {
static const int i = Bar::x;
};
int main(int argc, char* argv[]) {
std::cout << Foo::i << std::endl; // comment me
//std::cout << Foo<0>::i << std::endl; // uncomment me
}
如果你看到这种行为,这是一个编译器错误。
Comeau Online和Visual C ++ 2010都拒绝将代码视为无效,因为Bar::x
无法访问。 g ++ 4.1.2错误地接受了无效代码(有人需要用更高版本进行测试,看看它是否已经修复;这是我在笔记本电脑上使用的唯一版本)。
这看起来像GCC bug 40843.它被列为UNCONFIRMED,但我也可以在g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
上重现它。
VisualStudio 2010说:“错误C2248:'Bar :: x'[...]由于平台没有被指定,我估计这个假设几乎在Windows VC9上是错误的。
链接地址: http://www.djcxy.com/p/58707.html上一篇: c++ template seems to break access specifiers
下一篇: All fragments on backstack, have nulls in onSaveInstanceState, after rotation