2011-06-25 57 views
1

我正在使用Eclipse和MinGW。對於我在h文件中編寫的所有文件,我有undefined reference to錯誤,我在cpp文件中包含主要位置。我創建一個空的項目,並再次同樣的事情(Eclipse未定義的參考

的main.cpp

#include <iostream> 
#include "Stack.h" 

using namespace std; 

int main(){ 
    Stack<int> stack(10); 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    return 0; 
} 

stack.h

#ifndef STACK_H_ 
#define STACK_H_ 

template <class T> 
class Stack{ 
private: 
    struct StackEl; 
    StackEl *top; 
public: 
    Stack(); 
    Stack(T el); 
    ~Stack(); 
    void Push(const T& el); 
    T Pop(); 
}; 

#endif /* STACK_H_ */ 

和stack.cpp從stack.h inplements一切,如果我有不是h-file,而是cpp - 所有作品。請幫助!

我有以下錯誤

D:/Workspacee/Stack2/Debug/../src/Stack2.cpp:16: undefined reference to `Stack<int>::Stack(int)' 
D:/Workspacee/Stack2/Debug/../src/Stack2.cpp:18: undefined reference to `Stack<int>::~Stack()' 
D:/Workspacee/Stack2/Debug/../src/Stack2.cpp:18: undefined reference to `Stack<int>::~Stack()' 

回答

0

我不好,那是becouse模板!當你使用模板時,所有的代碼,包括函數的實現,都必須在頭文件中,或者你必須爲你要使用模板函數的每種類型編寫原型。我忘記了模板的使用與通常的功能不一樣:(

1

這是一個鏈接器錯誤。我不是Eclipse專家,但你必須告訴它以某種方式將Stack.o添加到鏈接命令。
如果包含Stack.cpp而不是Stack.h,則在編譯之前,來自cpp文件的實現會被預處理器包含在main.cpp中,因此鏈接階段沒有未解析的對外部函數的引用。

+0

我的不好,那是因爲模板!當你使用模板時,所有的代碼,包括函數的實現,都必須在頭文件中,或者你必須爲每一種你將要使用模板函數的類型編寫原型。我忘了模板的使用與通常的函數不一樣:( – Alecs