gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:54:49 25 4
gpt4 key购买 nike

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

#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.";
}

问题是,在我的主函数中调用 translateFromTengwarToEnglish 时,我不断收到“数字的多重定义[abi:cxx11]”错误,即使我相当确定我只定义了它一次,在我的头文件中,也使用了头文件保护。如果它可能有帮助,这是我不起眼的主要 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();
}

最佳答案

根据 C++ standard §3.1.2

A declaration is a definition unless it declares a function without specifying the function’s body, it contains the extern specifier or a linkage-specification and neither an initializer nor a function-body ...

头文件tengwarlibrary.hnumbers的声明是带有初始化器的extern声明。所以它也是一个定义。

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

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

关于C++ 多个定义,即使只给出一个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43304332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com