【问题标题】:std::map in a project error项目错误中的 std::map
【发布时间】:2014-06-01 21:38:52
【问题描述】:

我有这两个文件:

Circles.h:

#ifndef CIRCLE_H
#define CIRCLE_H
#include <map>
using namespace std;

map<int, int> colormap;

#endif

main.cpp:

#include <iostream>
#include "Circles.h"
using namespace std;

int main ()
{
     int a;
     cin>>a;
     cout<<a<<endl;
     return 0;
}

错误:

||=== 构建:在多游戏中调试(编译器:GNU GCC 编译器)===| obj\Debug\main.o||在函数ZSt11__addressofISt4pairIKiN2sf5ColorEEEPT_RS5_':| D:\SFML Projects\Mulit-game\main.cpp|7|multiple definition ofcolormap'| obj\Debug\Circles.o:c:\program files (x86)\codeblocks\mingw\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\gthr-default.h|300|首先在这里定义| ||=== 构建失败:2 个错误,0 个警告(0 分钟,0 秒)===|

我不知道为什么会这样,因为我搜索了我项目的所有文件,但地图只在 Circles.h 中找到。

【问题讨论】:

  • 请发布您的完整代码; colormap 在您发布的内容中不存在。
  • colormap 和 stuff 一样。
  • 我不知道这是否会有所不同,但不要在头文件中使用using namespace。它可能导致各种名称冲突。请改用std::map&lt;int, int&gt; colormap;
  • 我怀疑Circles.h 包含在多个源文件中。有了它,您将获得具有相同 id 的变量的 两个 定义。 extern - 在头文件中声明并在 one 源文件中直接定义
  • 不,Fred 仍然是同样的错误,即

标签: c++ gcc map


【解决方案1】:

我假设地图实际上称为colormap,并且头文件包含在多个源文件中?因为这是您得到该错误的唯一方法。

问题在于您在头文件中定义变量colormap,因此它在包含头文件的每个源文件中都定义了。

您应该只在头文件中进行外部声明,并在一个源文件中进行定义。


所以,在头文件中做例如

extern std::map<int, int> colormap;  // Declare the colormap variable

在您的一个源文件中,在全局范围内:

std::map<int, int> colormap;  // Define the colormap variable

【讨论】:

  • 谢谢,解决了。实际上,我在 Circles.h 中使用了 2 个源。这对我很有帮助,因为我需要它作为一个全局变量来更新某些形状的颜色。
  • @Ilman 你也可以直接把extern decl 放在另一个源文件中,但是(可能)像你一样,如果我声明一个用于容纳全局的类型,我更喜欢通过在类型之后立即指定 say-same 来使其可用,这也是这个答案所提供的。一般来说,如果可能的话,首先要避免使用全局变量,但是当你需要它们时,尽可能让它们易于剖析。在您的情况下,我可能也会 typedef 映射类型(在标题中),因为您稍后将在迭代器等中使用它。
  • 感谢您的提示,我将输入地图。
【解决方案2】:

不要在头文件中声明全局变量。

【讨论】:

  • 你可以在头文件中声明所有你想要的全局变量;只是不要在那里定义它们。
  • 最好不要声明或定义全局变量。
  • 我需要头文件中的全局变量。我知道如果没有必要我不应该这样做。
  • @Ilman:你应该尽量不要使用跨编译单元的变量,因为它不是很清楚它们的使用位置和方式。如果您只想要一份副本,那么也许应该将其封装在它自己的编译单元中。
【解决方案3】:

不知道为什么您的代码不起作用。我在 Visual Studio 中编写并构建良好。您正在使用 gcc 编译器,它可能更严格。我建议您不要在代码中两次使用“使用命名空间标准”。老实说,我建议根本不要使用“使用命名空间标准”。相反,在声明地图时,请执行以下操作:

std::map<int,int> myMap;

另外,如果您有一个全局变量(在您的情况下为颜色图),最好不要在定义类的文件中声明它(在您的情况下为 Circles?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多