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'函数移动到标题中,那么最终会出现重复的定义,您可能需要为标题包含警卫! –