0

设置

#include<utility> // I actually use precompiled headers 
#include<map>
...SOME CODE...
namespace{
... SOME CODE...
/*Line 278*/ std::map<std::pair<int,int>,SmartPointer<A>> myMap;
/*Line 279*/ myMap.at(std::make_pair(1,1));
}

SmartPointer 就是所说的 - 一个用智能指针包装其他类的类,用于自动堆内存管理。

发生的情况是,当我尝试编译它时,我得到了一大堆错误:

cpp(279): error C2143: syntax error : missing ';' before '.'
cpp(279): error C4430: missing type specifier - int assumed. Note: C++ does not 
support default-int
cpp(279): error C2371: '`anonymous-namespace'::map' : 
redefinition; different basic types
cpp(278) : see declaration of '`anonymous-namespace'::map'

第 278 和 279 行是上面的代码行。

可以看出,map 位于匿名命名空间中。我怀疑这是因为内部地图未配置为接受非标准类型作为值。

这一切都发生在 VS 2010 + 我也在使用 C++11。

问题

为什么会出现这些编译错误以及如何修复它们?

进步

>>不是问题 - 当我注释掉第二行时,文件编译时不会抱怨(使用>>> >)。

我将代码简化为这个 - 看看错误可能来自哪里 - 我得到以下一组编译错误:

代码:

std::map < int, int > myMap;
myMap[3] = 4;

错误:

cpp(279): error C4430: missing type specifier - int assumed. Note: C++ does not 
support default-int
cpp(279): error C2373: 'myMap' : redefinition; different type modifiers
cpp(278) : see declaration of 'myMap'
cpp(279): error C2440: 'initializing' : cannot convert from 'int' to 'int [3]'
There are no conversions to array types, although there are conversions 
to references or pointers to arrays

回答

@凯西

正如凯西所建议的,我不能把它放在myMap.at(..)命名空间范围内——我把它放在一个函数范围内,它得到了修复。

4

2 回答 2

0

你有一个名字冲突:

std::map<std::pair<int,int>,SmartPointer<A>> map;

名称map是类型。您不能将类型名称用作变量名称。就像是

std::map<std::pair<int,int>,SmartPointer<A>> myMapThatHasAUsefullName;

应该修复它。

于 2013-07-29T14:27:40.743 回答
0

只是不要重用标准库名称,例如map变量名称。称它为有意义的东西,它也会消除类型和变量之间的冲突。

还有,你忘记#include <utility>带了std::pair

于 2013-07-29T14:24:23.173 回答