2012-12-24 78 views
1

因此,大概我正在做一些令人難以置信的愚蠢的事情,只是抓住了它,但我一直在獲取一個未定義的引用,這是我最明確定義的函數。在我的cpp文件之一,我用下面的命令:對已定義函數的未定義引用

#include "MVec.h" 
... 
MVec ans; 
... 
for(int i = 0; i < 3; i++) 
    ans[i] = ... 

在MVec.h,我有:

class MVec { 
... 
inline double & operator[](const int i); 
inline const double & operator[](const int i) const; 
... 
}; 

最後,在mvec.cpp,我有:

inline double & MVec::operator[](const int i) { 
     #ifdef CHECK_BOUNDS 
     if(i < 0 || i >= 3) 
       throw("Subscript out of bounds"); 
     #endif 

     return vec[i]; 
} 

inline const double & MVec::operator[](const int i) const { 
     #ifdef CHECK_BOUNDS 
     if(i < 0 || i >= 3) 
       throw("Subscript out of bounds"); 
     #endif 

     return vec[i]; 
} 

不知何故,然而,當我編譯兩個.cpp文件,並試圖將它們鏈接

g++ atommanager.cpp -o atommanager.o 
g++ mvec.cpp -o mvec.o 
g++ atommanager.o mvec.o -o gpumd 

我總是得到一個錯誤:

atommanager.cpp:(.text+0x76): undefined reference to `MVec::operator[](int)' 

這裏,atommanager.cpp是我提到的第一.cpp文件的名稱。

+1

嘗試刪除內聯。當您將它聲明爲內聯時,編譯器可能會優化功能,以便鏈接時不再存在。或者,將全功能定義包含在Mvec.h中,而不是Mvec.cpp中 – happydave

+0

刪除內聯確實可以解決問題...在MVec.h中定義函數會導致另一個編譯器錯誤(包括mvec.cpp和atommanager.cpp都包含MVec.h,所以我得到一個函數定義兩次錯誤)。不幸的是,我使用這個函數有一點點,並希望保持內聯...我將不得不嘗試找到解決方法。 – wolfPack88

+1

如果您將'inline'函數移動到標題中,那麼最終會出現重複的定義,您可能需要爲標題包含警衛! –

回答

4

定義功能inline不提供外部可見的定義:定義只有在inline函數定義在翻譯中可見(我認爲只有在inline定義後調用,除非該功能也宣佈inline) 。解決此問題的最簡單方法是刪除inline。或者,您需要在標題中定義該功能。