下面顯然有一個外部代碼,如果有人能指出如何避免它,將不勝感激。具有相同類型的模板類的模板功能的朋友
感謝
1> ------構建開始:項目名稱:CH16,配置:調試的Win32 ------
1> p657_b_print.cpp
1> p657_b_main.obj :錯誤LNK2019:無法解析的外部符號「void __cdecl比較< int>(int &,class Car < int> &)」(?? $比較@ H @@ YAXAAHAAV?$ Car @ H @@@ Z)在函數_main中引用
1> \ na-13 \ my documents \ visual studio 2010 \ Projects \ Ch16 \ Debug \ Ch16.exe:致命錯誤LNK1120:1個未解析的外部小號
==========生成: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文件的一部分。 – detunized 2011-04-05 20:15:26
這通常是正確的,但在模板的情況下,我已經閱讀了在包含編譯模型中將聲明放入.h文件中,然後在.h中包含.cc與.h中的定義,因爲編譯器需要查看任何使用的模板的定義 – RandomCPlusPlus 2011-04-05 20:26:46
一個頭文件有兩個不同的cpp文件的目的是什麼? – 2011-04-05 20:56:22