小编Cre*_*ris的帖子

"auto"类型推导编译,而显式类型给出错误

我正在使用Visual Studio 2012,我发现了一些奇怪的东西.我不是在编写一些我必须要兼容多个编译器的东西,但它可能会变得更晚(当代码放在web上时,用户不希望得到编译器错误),但我不想写一些错误的东西,或者只是不是原生的东西.

所以这是测试代码:

class A{
    class B{
        public:
        int i;
    };
    B myB;
public:
    B& getB() { return myB; }
};

int main()
{
    A a;
    A::B& b = a.getB();
    auto& b2 = a.getB();
}
Run Code Online (Sandbox Code Playgroud)

主要弹出内部的第一行,error C2248: 'A::B' : cannot access private class declared in class 'A'而第二行正常编译.我想知道,auto应该像这样工作还是Visual Studio中的另一个bug?

我没有任何其他编译器可以测试它

你甚至可以写类似的东西std::cout << b2.i << "\n";,它编译得很好

根据πάνταῥεῖ的评论,我用gcc 4.8.1尝试了ideone,它以相同的方式编译,第一行是错误,第二行是完全正常的.

c++ auto visual-studio-2012

18
推荐指数
1
解决办法
352
查看次数

多个文件中的C ++全局变量

我有一个Class Button,其中包括一个ButtonManager类,用于管理按钮。

然后,我有2个处理事情的功能,其中1个就像登录窗口,只有几个按钮,第二个是游戏菜单本身,其中也有按钮。

但是,这两个窗口占用很多行,因此我决定将其拆分为多个.cpp文件,在这里我只是从main调用东西。

问题是,我需要在.cpps中都包含按钮类,并且main和secondary cpp还必须包含一些按钮,dummy.h其中包含呈现菜单的通用函数的声明。

主要问题是ButtonManager具有全局变量,并且在编译时会说该符号已经定义。

示例代码:

ah(就像它是“按钮管理器”头文件一样):

#ifndef _ABC_
#define _ABC_

struct A{
    int b;
}a = A();

#endif
Run Code Online (Sandbox Code Playgroud)

side.h(可以说这是用于主游戏窗口):

#ifndef _SIDE_H_
#define _SIDE_H_

int callSomething();

#endif    //_SIDE_H_:
Run Code Online (Sandbox Code Playgroud)

side.cpp:

#include "side.h"
#include "abc.h"

#include <iostream>

int callSomething()
{
    std::cout << a.b << "\n";
    return a.b;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp:

#include "abc.h"
#include "side.h"
#include <iostream>

int main()
{
    callSomething();
    std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,编译器抱怨:

1>side.obj : error LNK2005: "struct A a" (?a@@3UA@@A) already defined in DynamicDispatch.obj 1>H:\Microsoft Visual Studio 11.0\example\Debug\dynamicdispatch.exe …

c++ visual-studio-2012

1
推荐指数
1
解决办法
337
查看次数

标签 统计

c++ ×2

visual-studio-2012 ×2

auto ×1