簡體   English   中英

c ++模板似乎打破了訪問說明符

[英]c++ template seems to break access specifiers

以下代碼由於顯而易見的原因而無法編譯,即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上的假設是假的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM