[英]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.