2011-04-05 65 views
0

下面顯然有一個外部代碼,如果有人能指出如何避免它,將不勝感激。具有相同類型的模板類的模板功能的朋友

感謝

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; 
} 
+0

通常情況下,您不應該將.cpp文件包含到.h文件中。 .h文件通常包含類/函數聲明和內聯/模板實現。 .cpp文件包含其餘部分。 .cpp文件應包含所有依賴的.h文件。 .cpp文件應該獨立編譯,而不是其他.cpp文件的一部分。 – detunized 2011-04-05 20:15:26

+0

這通常是正確的,但在模板的情況下,我已經閱讀了在包含編譯模型中將聲明放入.h文件中,然後在.h中包含.cc與.h中的定義,因爲編譯器需要查看任何使用的模板的定義 – RandomCPlusPlus 2011-04-05 20:26:46

+1

一個頭文件有兩個不同的cpp文件的目的是什麼? – 2011-04-05 20:56:22

回答

1

全模板定義必須在一個文件中。您應該合併_b.cpp_b.h,並在程序中包含完整的模板。

+0

它**是**在一個文件中。一切都包含在'p657_b.h'中。 – detunized 2011-04-05 20:10:20

+0

@Andrey在文件組織方面(以及其他一切)我遵循Lippman的書。我有其他的代碼像上面那樣組織起來,並且工作正常 – RandomCPlusPlus 2011-04-05 20:12:43

+0

由於Stroustrup說你應該在模板聲明被用於翻譯單元之前包含它們,並且分別編譯它們的定義。在你的代碼模板是在一個單位 – Andrey 2011-04-05 20:28:28