2013-05-27 28 views
0

我正在嘗試製作自己的BST。我製作了使用模板的類樹。太精確的變量類型?

template <class T> 
class Tree { 
public: 
    Tree(void); 
    void insert (T key); 
private: 
    Node<T>* root; 
}; 

在main方法我有類似的東西:

Tree<int>* d = new Tree<int>(); 
int key; 
cin >> key; 
d->insert(klucz); 

我recived錯誤:

unresolved external symbol "public: void __thiscall Tree[int]::insert(int)" ([email protected][email protected]@@[email protected]) referenced in function _main

我不知道,我怎麼能讀取用戶數據,而無需precising類型的「關鍵「字段。

+0

你有defin ed'insert'? – 0x499602D2

+0

是的。這只是所有程序的一部分 – siwy

+2

然後,你是否與定義'insert'的模塊鏈接?因爲,錯誤消息指示鏈接程序無法在其正在查找的任何位置找到該定義。 –

回答

2

您沒有Tree::insert定義的任何地方,但你聲明它。它幾乎不存在,因此您需要添加功能:

//just code to make this example, and be able to compile it 
template <class T> class Node 
{ 
private: 
    std::vector<T> keys; 
public: 
    Node() 
    { 

    } 
    size_t Add(T key) 
    { 
     keys.push_back(key); 
     return keys.size() - 1; 
    } 
}; 

//tree.h 
template <class T> 
class Tree { 
public: 
    Tree(void); 
    void insert (T key); 
private: 
    Node<T>* root; 
}; 

//tree.cpp 
template <class T> Tree<T>::Tree (void) 
{ 
    //construction code here 
    //example: 
    root = new Node<T>; 
} 

template <class T> void Tree<T>::insert (T key) 
{ 
    //insert code here 
    //example: 
    root->Add(key); 
} 

//main.cpp 
int main() 
{ 
    Tree<int>* d = new Tree<int>(); 
    int key; 
    std::cin >> key; 
    d->insert(key); 
    return 0; 
} 
如果你想讀的任何數據和字符串之間進行轉換

,整數,雙打等那麼我建議你看看boost::anyboost::lexical_cast,經過一些修改,你可以做這樣的事情:

template <class T> class Node 
{ 
private: 

public: 
    std::vector<T> keys; 
    Node() 
    { 

    } 
    size_t Add(T key) 
    { 
     keys.push_back(key); 
     return keys.size() - 1; 
    } 
}; 

template <class T> 
class Tree { 
public: 
    Tree(void); 
    void insert (T key); 
    T& get(size_t index); 
private: 
    Node<T>* root; 
}; 

template <class T> Tree<T>::Tree (void) 
{ 
    //construction code here 
    //example: 
    root = new Node<T>(); 
} 

template <class T> void Tree<T>::insert (T key) 
{ 
    //insert code here 
    //example: 
    root->Add(key); 
} 

template <class T> T& Tree<T>::get (size_t index) 
{ 
    //get code here 
    //example: 
    return root->keys[index]; 
} 

#include <boost/lexical_cast.hpp> 
int main() 
{ 
    Tree<std::string>* d = new Tree<std::string>; 
    std::string key; 
    std::cin >> key; 
    d->insert(key); 
    std::cout << "Your input:\n"; 
    std::cout << "\tString: " << boost::lexical_cast<std::string>(d->get(0)).c_str() << "\n"; 
    std::cout << "\tFloat: " << boost::lexical_cast<float>(d->get(0)) << "\n"; 
    std::cout << "\tDouble: " << boost::lexical_cast<double>(d->get(0)) << "\n"; 
    std::cout << "\tInt: " << boost::lexical_cast<int>(d->get(0)) << "\n"; 
    return 0; 
} 

輸出:

enter image description here