2013-06-03 34 views
10

Ok guys ... Tôi đã sau lớpTemplate lớp constructor

#include <functional> 

template <typename TValue, typename TPred = std::less<TValue>> 
class BinarySearchTree { 
    struct TNode { 
     TValue value; 
     TNode *pLeft; 
     TNode *pRight; 
    }; 
public: 
    BinarySearchTree(); 
    ~BinarySearchTree(); 

    . . . 
private: 
    TNode *pRoot; 

    . . . 
}; 

sau đó trong tập tin cpp của tôi định nghĩa ctor/dtor như thế này:

template <typename TValue, typename TPred> 
BinarySearchTree<TValue, TPred>::BinarySearchTree() : pRoot(0) {} 

template <typename TValue, typename TPred> 
BinarySearchTree<TValue, TPred>::~BinarySearchTree() { 
    Flush(pRoot); 
} 

chức năng chính của tôi:

int main() {  
    BinarySearchTree<int> obj1; 
    return 0; 
} 

và tôi nhận được lỗi liên kết sau:

public: __thiscall BinarySearchTree<int,struct std::less<int>>::BinarySearchTree<int,struct std::less<int> >(void) 

tôi đã cố gắng đặt định nghĩa hàm tạo vào tệp tiêu đề và tôi không nhận được lỗi. chỉ khi tôi cố gắng xác định nó trong tệp cpp.

+6

Câu trả lời cho câu hỏi của bạn là [ở đây] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) - xin lỗi, liên kết sai trong phiếu bầu gần nhất –

Trả lời

17

Không xác định mẫu trong tệp cpp, nhưng thực hiện các chức năng trong tệp tiêu đề và giữ nguyên chức năng chính của bạn. Các mẫu được gạch chân theo mặc định. Do đó chúng không hiển thị với trình liên kết. Và tệp chứa chính() không thể xem định nghĩa của các mẫu. Do đó lỗi.

+3

Tôi muốn điều này được hiển thị rõ hơn trên tất cả các trang web hướng dẫn C++. –

0

để khoảng trống cuối cùng và thử. nó có thể được coi là nhà điều hành trái thay đổi!

template <typename TValue, typename TPred = std::less<TValue> > 
+10

Bạn có thể không thêm khoảng trắng giữa '>>' kể từ C++ 11. – taocp

Các vấn đề liên quan