C ++多个定义,即使只给出了一个定义

时间:2017-04-09 07:50:36

标签: c++ compiler-errors multiple-definition-error

我试图制作一个小的无序地图,我可以用来永久地存储键和值,作为一种字典。类型TengwarChar只是一个具有两个值的对象,一个字符串和一个枚举,后来我也会添加方法。我使用的标题如下:

#ifndef TENGWARLIBRARY_H
#define TENGWARLIBRARY_H

#include "tengwarchar.h"
#include <unordered_map>
#include <algorithm>
#include <string>

typedef std::unordered_map<std::string, TengwarChar> CharMap;

extern const CharMap numbers = {
    {"0", TengwarChar("ð", SHORT)},
    {"1", TengwarChar("ñ", SHORT)},
    {"2", TengwarChar("ò", SHORT)},
    {"3", TengwarChar("ó", SHORT)},
    {"4", TengwarChar("ô", SHORT)},
    {"5", TengwarChar("õ", SHORT)},
    {"6", TengwarChar("ö", SHORT)},
    {"7", TengwarChar("÷", SHORT)},
    {"8", TengwarChar("ø", SHORT)},
    {"9", TengwarChar("ù", SHORT)}
 };

std::string translateFromEnglishToTengwar(std::string str);
std::string translateFromTengwarToEnglish(std::string str);

#endif // TENGWARLIBRARY_H

然后,我有一个简单的测试cpp文件:

#include "tengwarlibrary.h"

std::string translateFromEnglishToTengwar(std::string str)
{
    std::transform(str.begin(), str.end(), str.begin(), (int (*)(int))std::tolower);
    return str;
}

std::string translateFromTengwarToEnglish(std::string str)
{
    return "Hello world.";
}

问题是,我不断得到数字的多重定义[abi:cxx11]&#39;在我的main函数中调用translateFromTengwarToEnglish时出现错误,即使我相当确定我只在头文件中定义了一次,也使用了头文件保护。万一它可能会有所帮助,这是我简陋的主要cpp文件:

#include "mainwindow.h"
#include <QApplication>

#include <iostream>

#include "utils/tengwarlibrary.h"

int main(int argc, char *argv[])
{

    std::string s = "BlaH FElfeFEJI, IEORlfj";
    std::cout<<translateFromEnglishToTengwar(s)<<std::endl;

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:3)

根据C++ standard§3.1.2

  

声明是一个定义,除非它声明了一个函数而没有指定函数的主体,它包含extern说明符或者链接规范而且都不是   初始化者也不是函数体......

头文件numbers中的tengwarlibrary.h声明是带初始化程序的extern声明。所以它也是一个定义。

由于您已将tengwarlibrary.h包含在两个源文件中(其中一个文件已定义translateFromTengwarToEnglish()且其中main()已定义),因此它们都定义为numbers。因此,错误。

要解决此问题,请在头文件中使用number声明extern,并在单个源文件中初始化它。