1

以下代码大致代表我正在处理的一些序列化内容,使用 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 编译。

更新:接受的答案说它应该可以工作,但对于微软来说,它不是典型的。我在这里填写了一个错误报告:http ://connect.microsoft.com/VisualStudio/feedback/details/801829/incomplete-decltype-support-in-c-11-compiler

(如果有人可以为这个问题提出一个更好的标题,我将不胜感激!)

4

2 回答 2

2

我认为你的代码应该可以工作(如在 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;
}

请注意,我删除了decltypeas sizeofcan work 直接在表达式上。

于 2013-09-21T06:45:28.390 回答
0

也许你的代码的问题是结构就像类,你在类中定义结构,但编译器不知道这个类(或结构)存在,直到它编译整个类。

于 2013-09-21T06:33:47.667 回答