簡體   English   中英

為什么此公共成員函數不能在類內部聲明的私有struct成員上調用decltype?

[英]Why can't this public member function call decltype on a private struct member declared inside the class?

以下代碼松散地代表了我正在處理的一些序列化工作,它們使用g ++( http://ideone.com/0rsGmt )進行編譯,但是Visual Studio Express 2013 RC失敗並出現以下錯誤:

Error 1 error C2326: 'void foo::print(void)' : function cannot access 'foo::bar::member_'
Error 2 error C2039: 'bar' : is not a member of 'foo'

編碼:

#include <iostream>

class foo
{   
    private:
        struct bar
        {
            int member_;
        };

    public:
        void print()
        {
            std::cout << sizeof(decltype(foo::bar::member_)) << std::endl;
        }
};

int main(int argc, char* argv[])
{
    foo f;
    f.print();
    return 0;
}

怎么了? Visual Studio不足或其他問題? 顯然,我可以將struct聲明移出類; Daniel Frey在下面提供了一種解決方法; 但是我想知道為什么上面的代碼不能在Visual Studio中按原樣編譯。

更新:可接受的答案說它應該起作用,但是對於Microsoft來說通常是不行的。 我在這里填寫了一個錯誤報告: http : //connect.microsoft.com/VisualStudio/feedback/details/801829/incomplete-decltype-support-in-c-11-compiler

(如果有人可以為這個問題建議一個更好的標題,我將不勝感激!)

我認為您的代碼應該可以工作(例如在GCC或Clang上),

5個表達式[expr]

8在某些情況下,會出現未評估的操作數 (5.2.8、5.3.3、5.3.7、7.1.6.2)。 未評估的操作數不評估。 未評估的操作數被視為完整表達式。 [ 注意:在未評估的操作數中,可以將非靜態類成員命名為(5.1),而對象或函數的命名本身並不要求提供定義(3.2)。 尾注 ]

似乎VC ++並沒有實現該注釋所闡明的內容,因此您需要一個(偽造的)實例作為使VC ++滿意的一種解決方法。 這應該工作:

void print()
{
    std::cout << sizeof(std::declval<bar>().member_) << std::endl;
}

請注意,我刪除了decltype因為sizeof可以直接處理表達式。

也許您的代碼的問題在於結構就像類,並且您在類內部定義了結構,但是編譯器直到編譯整個類才知道該類(或結構)是否存在。

暫無
暫無

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

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