私が取り組んでいるいくつかのシリアライゼーションを大まかに表す次のコードは、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 の不備か何か?明らかに、構造体宣言をクラスの外に移動できます。Daniel Frey は以下の回避策を提供しています。しかし、上記のコードが Visual Studio でそのままコンパイルされない理由を知りたいです。
更新:受け入れられた回答では、機能するはずですが、Microsoft では一般的であるように機能しません。ここにバグ レポートを記入しました: http://connect.microsoft.com/VisualStudio/feedback/details/801829/incomplete-decltype-support-in-c-11-compiler
(誰かが質問のより良いタイトルを提案できるなら、私はそれを感謝します!)