我試圖做一個小的無序映射,我可以用它來永久存儲鍵和值,作爲一種字典。類型TengwarChar
只是一個具有兩個值的對象,一個字符串和一個枚舉,稍後我也會添加方法。我使用的標題如下:C++多個定義,即使只有一個定義
#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]'的錯誤,在我的主函數中調用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();
}
您只能在頭文件中聲明帶外部鏈接的符號。他們的定義需要在翻譯單位使用它們。 –
@HenriMenke當我刪除'extern const'位並假設它是一個全局變量時,我得到了同樣的錯誤。當我可以在標題中使用初始值設定項時,我並不想將定義放入源文件中。 –
@AndrewLalis你不能。您編寫它的方式,每個源文件隱式獲取numbers數組的* definition *。你應該在頭文件中聲明數組,並且在一個源文件中定義它(沒有extern關鍵字)。 –