2017-04-09 75 views
0

我試圖做一個小的無序映射,我可以用它來永久存儲鍵和值,作爲一種字典。類型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(); 
} 
+0

您只能在頭文件中聲明帶外部鏈接的符號。他們的定義需要在翻譯單位使用它們。 –

+0

@HenriMenke當我刪除'extern const'位並假設它是一個全局變量時,我得到了同樣的錯誤。當我可以在標題中使用初始值設定項時,我並不想將定義放入源文件中。 –

+0

@AndrewLalis你不能。您編寫它的方式,每個源文件隱式獲取numbers數組的* definition *。你應該在頭文件中聲明數組,並且在一個源文件中定義它(沒有extern關鍵字)。 –

回答

2

根據C++ standard§3.1.2

的聲明是一個定義,除非它宣稱的功能,而無需指定函數體,它包含的extern聲明符或一個鍵的說明書和既不是 初始化,也不是一個功能體...

在頭文件宣言是帶初始值設定項的外部聲明。所以這也是一個定義。

正如你已經包括兩個tengwarlibrary.h源文件(即一個translateFromTengwarToEnglish()定義何main()定義)兩者有numbers定義。因此,錯誤。

要解決此問題,請在頭文件中聲明numberextern,並將其初始化爲單個源文件。