2012-12-24 57 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。或者,您需要在标题中定义该功能。