考虑这段代码
#include <iostream>
#include <cstdio>
using namespace std;
class Dummy {
public:
Dummy();
};
inline Dummy::Dummy() {
printf("Wow! :Dummy rocks\n");
}
int main() {
Dummy d;
}
这里一切都很好!
现在我做这个修改。我把Dummy的声明移到了“dummy.h”。
class Dummy {
public:
Dummy();
};
在“dummy.cpp”中定义构造函数Dummy(),如下所示
#include "dummy.h"
inline Dummy::Dummy() {
printf("Wow! :Dummy rocks\n");
}
最后,我的主文件为:
#include <iostream>
#include <cstdio>
#include "dummy.h"
using namespace std;
int main() {
Dummy d;
}
它编译得很好,但是我收到一个链接器错误抱怨对Dummy :: Dummy()的未定义引用。
任何见解。
-
答案 0 :(得分:3)
您必须将所有内联函数(包括方法和构造函数/析构函数)放在头文件中,并在其中声明它们。
虽然此代码应该以任何一种方式运行,main()
调用构造函数,就好像inline
关键字不存在一样。您确定要将目标文件从两个编译单元传递到链接器吗?
答案 1 :(得分:2)
您应该考虑编译是如何在C ++中工作的,以及在C ++中使用的单独编译单元以及使用头文件和cpp文件获得的封装的想法。
看这里: http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6
内联告诉编译器,而不是调用函数在函数调用的位置“复制 - 粘贴”其代码。当您将内联定义放在CPP文件中时,在链接到其他编译单元(它在cpp文件中而不是在h文件中)时它将不可见,因此编译器可以从类中放置的签名中了解到没有参数Con的所以它不会实现默认的。但链接器无法找到函数体,因为它在cpp文件中实现了 inline 。
答案 2 :(得分:0)
尝试从实现文件中删除内联说明符。如果我的理解是正确的,你只能在标题中内嵌