2010-06-27 69 views
3

下面的代码由于显而易见的原因不编译,即Foo试图访问Bar的私有成员。但是,如果您取消注释/注释标记的行,将Foo作为模板,它会编译并输出42.我在这里错过了什么?为什么这个工作?在我看来,它不应该。C++模板似乎打破访问说明符

感谢您的帮助。

#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 
} 
+2

编译器错误,我猜猜我应该这样抱怨 – 2010-06-27 17:08:04

+0

'-1'从我没有提到编译器的可能性是一个编译器错误 – sbi 2010-06-27 17:12:49

+0

对不起sbi,意识到我应该完成了。已经把它作为评论詹姆斯的答案,它的海湾合作委员会4.4.3 – tjm 2010-06-27 17:14:14

回答

5

如果你看到这种行为,这是一个编译器错误。

Comeau Online和Visual C++ 2010都拒绝将代码视为无效,因为Bar::x无法访问。 g ++ 4.1.2错误地接受了无效代码(有人需要用更高版本进行测试,看看它是否已经修复;这是我在笔记本电脑上使用的唯一版本)。

+1

哦,好的,谢谢。我使用的是gcc 4.4.3,应该提到在 – tjm 2010-06-27 17:10:27

+0

的帖子中gcc 4.5.0也会在代码中咆哮。如果我没记错的话,铿锵尚未进行访问检查。 – pmr 2010-06-27 17:15:30

+0

是的,[发送给gcc人](http://gcc.gnu.org/bugs/)。 – 2010-06-27 17:16:29

-4

VisualStudio中表示,2010年“错误C2248: '酒吧:: X'[...] 作为。平台不speciifed,我已评估的假设是错误的,几乎在Windows VC9

+3

-1。这绝对没有帮助。 – 2010-06-27 17:12:21

3

这似乎是。 GCC bug 40843。它被列为UNCONFIRMED,但我也可以在g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3上重现它。

+0

谢谢,这很有帮助。让我知道它是已知的,并且如果我想报告我的经验,就会阻止我提交不必要的新错误报告。不幸的是,我不能注册,因为我不是一个注册用户,但是如果我能,我会在我的时候! – tjm 2010-06-27 21:06:58

+0

好抓;我搜索时没有找到那个。 +1 – 2010-06-28 03:05:21