2013-03-01 38 views
-2

我有以下代碼:C++爲聯成員函數鏈接錯誤

IFile.h

class IFile 
{ 
public: 
    IFile(); 
    ~IFile(void); 

    inline bool IsValidFileType() const; 
}; 

IFile.cpp

IFile::IFile() 
{ 
    //IsValidFileType(); 
} 

IFile::~IFile(void) 
{ 
} 

inline bool IFile::IsValidFileType() const 
{ 
      return true; 
} 

的main.cpp

int main(int argc, char* argv[]) 
{ 
    IFile* pFile = new IFile(); 
    pFile->IsValidFileType(); 

    return 0; 
} 

當編譯代碼我收到以下錯誤:在函數引用_main

: 「布爾__thiscall的IFile :: IsValidFileType(無效)常量公開」(IsValidFileType @的IFile @@ QBE_NXZ?): 錯誤LNK2019解析的外部符號

如果我改變函數的枯燥的「inline」或「const」qualiferes,或者在構造函數中調用它,程序將會complile。 你能解釋這種行爲嗎?

+2

要將其內聯,它需要在呼叫位置可見。把它放在標題中將是修復它的一種方法 – 2013-03-01 14:43:35

+1

「inline」並不意味着「不符合」:-( – 2013-03-01 14:43:47

+0

請在提問之前進行搜索。有這麼多的重複項.... – JoergB 2013-03-01 14:45:34

回答

0

編譯器如何內聯一個在代碼編譯時看不到的函數?在編譯main.cpp時,編譯器被要求做這件事。

0

內聯函數的代碼被編譯到引用它的每個翻譯單元中(畢竟是這個想法)。意思是說,你需要將代碼包含在頭文件中。

0

inline關鍵字向編譯器承諾,它將能夠在每個使用它的翻譯單元(* .cpp文件)中看到定義。你違背了這個承諾,因爲儘管main.cpp包含了IFile.h,但它看不到定義。

關鍵字inline的常用函數應該在頭文件中定義,而不是在源文件中定義。

+0

謝謝。是有道理的,但爲什麼刪除常量也解決了這個問題? – user2123914 2013-03-01 14:46:58

+0

我看不出任何理由去除'const's,什麼都不做會在這裏有所作爲。 – aschepler 2013-03-01 14:52:18

0

由於函數是內聯的,因此您必須在頭文件中定義它,而不是在cpp文件中。