And*_*lis 0 c++ compiler-errors multiple-definition-error
我正在尝试制作一个小的无序映射,我可以用它来永久存储键和值,作为一种字典。该类型TengwarChar只是一个具有两个值的对象,一个字符串和一个枚举,稍后我也会添加方法。我使用的标题如下:
#ifndef TENGWARLIBRARY_H\n#define TENGWARLIBRARY_H\n\n#include "tengwarchar.h"\n#include <unordered_map>\n#include <algorithm>\n#include <string>\n\ntypedef std::unordered_map<std::string, TengwarChar> CharMap;\n\nextern const CharMap numbers = {\n {"0", TengwarChar("\xc3\xb0", SHORT)},\n {"1", TengwarChar("\xc3\xb1", SHORT)},\n {"2", TengwarChar("\xc3\xb2", SHORT)},\n {"3", TengwarChar("\xc3\xb3", SHORT)},\n {"4", TengwarChar("\xc3\xb4", SHORT)},\n {"5", TengwarChar("\xc3\xb5", SHORT)},\n {"6", TengwarChar("\xc3\xb6", SHORT)},\n {"7", TengwarChar("\xc3\xb7", SHORT)},\n {"8", TengwarChar("\xc3\xb8", SHORT)},\n {"9", TengwarChar("\xc3\xb9", SHORT)}\n };\n\nstd::string translateFromEnglishToTengwar(std::string str);\nstd::string translateFromTengwarToEnglish(std::string str);\n\n#endif // TENGWARLIBRARY_H\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我有一个简单的测试 cpp 文件:
\n\n#include "tengwarlibrary.h"\n\nstd::string translateFromEnglishToTengwar(std::string str)\n{\n std::transform(str.begin(), str.end(), str.begin(), (int (*)(int))std::tolower);\n return str;\n}\n\nstd::string translateFromTengwarToEnglish(std::string str)\n{\n return "Hello world.";\n}\nRun Code Online (Sandbox Code Playgroud)\n\n问题是,当在我的主函数中调用时,我不断收到“数字的多重定义[abi:cxx11]”错误translateFromTengwarToEnglish,即使我相当确定我只在头文件中使用它定义了一次头球后卫也。如果它可能有帮助,这是我简陋的主 cpp 文件:
#include "mainwindow.h"\n#include <QApplication>\n\n#include <iostream>\n\n#include "utils/tengwarlibrary.h"\n\nint main(int argc, char *argv[])\n{\n\n std::string s = "BlaH FElfeFEJI, IEORlfj";\n std::cout<<translateFromEnglishToTengwar(s)<<std::endl;\n\n QApplication a(argc, argv);\n MainWindow w;\n w.show();\n\n return a.exec();\n}\nRun Code Online (Sandbox Code Playgroud)\n
根据C++标准\xc2\xa73.1.2
\n\n\n\n\n声明是一个定义,除非它声明一个函数而不指定函数\xe2\x80\x99s 主体,它包含 extern 说明符或链接规范,既不包含初始化程序也不包含函数主体...
\n
numbers头文件中的声明tengwarlibrary.h是带有初始值设定项的外部声明。所以它也是一个定义。
由于您已包含tengwarlibrary.h在两个源文件中(一个translateFromTengwarToEnglish()是定义的,一个是main()定义的),它们都具有numbers. 因此,出现错误。
为了解决这个问题,在头文件中声明number并extern在单个源文件中初始化它。
| 归档时间: |
|
| 查看次数: |
5567 次 |
| 最近记录: |