2012-12-09 77 views
3

所以我有幾個,我想編譯的文件一起其中一個stack.h與stack.cpp 這就是我的頭文件:製作生成文件的模板類

#include<iostream> 
#ifndef STACK_H 
#define STACK_H 
template <class ItemType> 
class StackType 
{ 
public: 
    //code 


private: 
    //code 
}; 
#include "stack.cpp" 
#endif 

的話,我已經堆的.cpp

#include "stack.h" 
#include <iostream> 
using namespace std; 

template<class ItemType> 
StackType<ItemType>::StackType(){ 
    top = -1; 
    MAX_ITEMS = 200; 
} 

//other codes 
} 

但它說,我重新定義代碼stack.cpp

這就是我的makefile

main.o: main.cpp stack.h 
    g++ $(CFLAGS) -c -o main.o main.cpp 
stack.o: stack.cpp stack.h 
    g++ $(CFLAGS) -c -o stack.o stack.cpp 

我看不出問題所在。

+0

什麼說你正在重新定義代碼?請發佈*確切*錯誤消息。 –

回答

6

您不應該嘗試編譯stack.o。這是需要包含在客戶端代碼中的模板代碼,無法構建。只需添加stack.cpp依賴於main.o規則(假設main.cpp中包括stack.h,並刪除stack.o規則:

main.o: main.cpp stack.h stack.cpp 
    g++ $(CFLAGS) -c -o main.o main.cpp 

你有另外一個問題,那就是您在stack.cppstack.h,反之亦然。你應該從stack.cpp刪除#include stack.h

由於模板代碼不應該由自己來編,我建議改變stack.cpp別的東西的後綴,如.icpp

0

即使對於模板,分離您的接口和實現的想法是一個值得尊敬的位置。我可能會建議你不要調用模板實現文件.cpp文件。 Boost在這種情況下使用ipp,這對我來說似乎是合理的。

你做了正確的事情包括它,只是在編譯它錯誤的東西......哪些.cpp會表明你應該做。

相關問題