所以假设我正在做一些令人难以置信的愚蠢并抓住它,但我一直得到一个未定义的引用我最明确定义的函数。在我的一个.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文件的名称。
答案 0 :(得分:4)
定义函数inline
不提供外部可见的定义:定义仅在定义inline
函数的转换中可见(我认为仅适用于{{1}之后的调用除非函数也声明为inline
),否则定义。解决问题的最简单方法是删除inline
。或者,您需要在标题中定义函数。