【发布时间】:2011-07-30 06:33:32
【问题描述】:
下面的代码中显然有一个外部代码,如果有人能指出如何避免它,将不胜感激。
谢谢
1>----- 构建开始:项目:Ch16,配置:调试 Win32 ------
1> p657_b_print.cpp
1>p657_b_main.obj:错误 LNK2019:无法解析的外部符号“void __cdecl compare(int &,class Car &)”(??$compare@H@@YAXAAHAAV?$Car@H@ @@Z) 在函数 _main 中引用
1>\na-13\my documents\visual studio 2010\Projects\Ch16\Debug\Ch16.exe : 致命错误 LNK1120: 1 unresolved externals
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
p657_b.h:
#ifndef P657H
#define P657H
template< class T> class Car;
template<class T1> void compare(T1&, Car<T1>&);
template< class T> class Car {
friend void compare<T> (T&, Car<T>&);
private:
T Wheels;
public:
Car(): Wheels(4) {}
Car(T);
};
#include "p657_b.cpp"
#include "p657_b_print.cpp"
#endif
p657_b.cpp:
#ifndef P643CC
#define P643CC
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
#include "p657_b.h"
template<class T> Car<T>::Car(T w) {
Wheels = w;
}
#endif
p657_b_print.cpp:
#ifndef p657_CC
#define p657_CC
#include "p657_b.h"
#include<iostream>
using namespace std;
template <class T>
void compare(T &iv1, Car<T> &c1) {
cout << iv1 << endl;
cout << c1.Wheels << endl;
}
#endif
p657_b_main.cpp:
#include "p657_b.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
Car<int> myCar;
int iv = 5;
compare(iv, myCar);
return 0;
}
【问题讨论】:
-
通常你不应该将 .cpp 文件包含到 .h 文件中。 .h 文件通常包含类/函数声明和内联/模板实现。 .cpp 文件包含其余部分。 .cpp 文件应包括它们所依赖的所有 .h 文件。 .cpp 文件应独立编译,而不是作为其他 .cpp 文件的一部分。
-
这通常是正确的,但在模板的情况下,我已经读过在包含编译模型中你将声明放在 .h 文件中,然后你在 .h 中包含 .cc 和定义,因为编译器需要查看任何使用过的模板的定义
-
一个头文件两个不同的cpp文件的目的是什么?
-
没有我想,这是一个好点。让我看看它是否使代码工作。
-
现在可以使用了 - 非常感谢。该代码还可以通过执行 Andrey 下面的建议来工作。目前我更喜欢我的文件组织方式,即 Lippman 建议的方式。当我阅读 Stroustrup 时,我可能会改变主意,但我的生活已经足够复杂,只关注一位作者,所以只有在我对自己所做的事情更有信心之后,我才会考虑不同的方法。谢谢
标签: c++ class templates function