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文件的名稱。
嘗試刪除內聯。當您將它聲明爲內聯時,編譯器可能會優化功能,以便鏈接時不再存在。或者,將全功能定義包含在Mvec.h中,而不是Mvec.cpp中 – happydave
刪除內聯確實可以解決問題...在MVec.h中定義函數會導致另一個編譯器錯誤(包括mvec.cpp和atommanager.cpp都包含MVec.h,所以我得到一個函數定義兩次錯誤)。不幸的是,我使用這個函數有一點點,並希望保持內聯...我將不得不嘗試找到解決方法。 – wolfPack88
如果您將'inline'函數移動到標題中,那麼最終會出現重複的定義,您可能需要爲標題包含警衛! –