-1
1>------ Build started: Project: project4, Configuration: Debug Win32 ------
1>  proj4_driver.cpp
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: class cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > const & __thiscall cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::operator=(class cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > const &)" (??4?$BST@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@cop4530@@QAEABV01@ABV01@@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: __thiscall cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(int)" (??0?$BST@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@cop4530@@QAE@H@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: __thiscall cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(class cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > const &)" (??0?$BST@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@cop4530@@QAE@ABV01@@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: __thiscall cop4530::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::BST<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0?$BST@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@cop4530@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: class cop4530::BST<int> const & __thiscall cop4530::BST<int>::operator=(class cop4530::BST<int> const &)" (??4?$BST@H@cop4530@@QAEABV01@ABV01@@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: __thiscall cop4530::BST<int>::BST<int>(int)" (??0?$BST@H@cop4530@@QAE@H@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: __thiscall cop4530::BST<int>::BST<int>(class cop4530::BST<int> const &)" (??0?$BST@H@cop4530@@QAE@ABV01@@Z) referenced in function _main
1>proj4_driver.obj : error LNK2019: unresolved external symbol "public: __thiscall cop4530::BST<int>::BST<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0?$BST@H@cop4530@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) referenced in function _main
1>c:\users\ah09e\documents\visual studio 2010\Projects\project4\Debug\project4.exe : fatal error LNK1120: 8 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

これはドライバーです:

    #include <iostream>
    #include <string>
    #include "bst.h"

    using namespace std;
    using namespace cop4530;

    int main() {
    string input;

// get a list of integer values
cout << "Enter a list of integer values in one line: ";
getline(cin, input);

// create a binary search tree
BST<int> bst1(input);
if (!bst1.empty()) {
    cout << "Inorder traversal: ";
    bst1.printInOrder();
    cout << "Level order traversal: ";
/////////////bst1.printLevelOrder();

    // test copy constructor
    BST<int> bst2(bst1);
    cout << "Testing copy constructor: ";
    //////////////bst2.printLevelOrder();

    // test assignment operator
    BST<int> bst3;
    bst3 = bst1;
    cout << "Testing assignment operator: ";
    ////////////bst3.printLevelOrder();
 }

// get a list of string values
cout << "Enter a list of string values in one line: ";
getline(cin, input);

// create a binary search tree
BST<string> bsts1(input);
if (!bsts1.empty()) {
    cout << "Inorder traversal: ";
    bsts1.printInOrder();
    cout << "Level order traversal: ";
////////bsts1.printLevelOrder();

    // test copy constructor
    BST<string> bst2(bsts1);
    cout << "Testing copy constructor: ";
    ////////////bst2.printLevelOrder();

    // test assignment operator
    BST<string> bst3;
    bst3 = bsts1;
    cout << "Testing assignment operator: ";
    ///////////bst3.printLevelOrder();
 }

cout << "Enter a list of integer values: ";
getline(cin, input);
/////bst1.buildFromInputString(input);
cout << "Level order traversal: ";
////bst1.printLevelOrder();

cout << "\n===================\n";
cout << "Operation Manual:" << endl;
cout << "d: delete value;\ti: insert value;" << endl;
cout << "h: height of tree; \tn: number of nodes" << endl;
cout << "o: in order print; \tl: level order print" << endl;
cout << "s: search value;\tq: quit" << endl;
cout << "===================\n";
cout << "choice: ";
int tmp;
while (getline(cin, input)) {
if (input == "q")
    break;
if (input == "d") {
    cout << "Type value to delete: ";
    cin >> tmp;
    cin.ignore();
    bst1.remove(tmp);
} else if (input == "i") {
    cout << "Type value to insert: ";
    cin >> tmp;
    cin.ignore();
    bst1.insert(tmp);
} else if (input == "o") {
    cout << "In order traversal: ";
    bst1.printInOrder();
} else if (input == "l") {
    cout << "Level order traversal: ";
    ///////bst1.printLevelOrder();
} else if (input == "h") {
    cout << "Height: ";
    cout << bst1.height() << endl;
} else if (input == "n") {
    cout << "Number of nodes: ";
    cout << bst1.numOfNodes() << endl;
} else if (input == "s") {
    cout << "Type value to search: ";
    cin >> tmp;
    cin.ignore();
    if (bst1.contains(tmp)) {
    cout << "contains " << tmp << endl;
    } else {
    cout << "does not contains " << tmp << endl;
    }
}

cout << "\n===================\n";
cout << "Operation Manual:" << endl;
cout << "d: delete value;\ti: insert value;" << endl;
cout << "h: height of tree; \tn: number of nodes" << endl;
cout << "o: in order print; \tl: level order print" << endl;
cout << "s: search value;\tq: quit" << endl;
cout << "===================\n";
cout << "choice: ";
}
return 0;
}

そしてbst.h:

#ifndef COP4530_PROJ4_H
#define COP4530_PROJ4_H

#include<iostream>
#include<string>
using std::string;

namespace cop4530{

//using std::string;
int default_threshold_value = 1;

template <typename T>
class BST
{

public:

BST(int th=default_threshold_value); 
BST(const string input, int th=default_threshold_value);
BST(const BST&);
~BST();//
void buildFromInputString(const string input);
const BST & operator=(const BST & rhs);//
bool empty();//


void printInOrder() const;//
//void printLevelOrder() const;//
int numOfNodes() const;//
int height() const;//
void makeEmpty();//
void insert(const T& v);//
void remove(const T& v);//
bool contains (const T& v);//


private:
struct BSTNode
{
T element;
BSTNode *left;
BSTNode *right;
int height;
//void printInOrder(BSTNode *t) const;

BSTNode(const T & theElement, BSTNode *lt, BSTNode *rt, int h=0)
    : element(theElement), left(lt), right(rt), height(h) {}
};

BSTNode *root;

void printInOrder(BSTNode *t) const;//
//void printLevelOrder(BSTNode *t) const;
void makeEmpty(BSTNode* &t);//
void insert(const T& v, BSTNode *&t);//
void remove(const T& v, BSTNode *&t);//
bool contains(const T& v, BSTNode *&t);//
int numOfNodes(BSTNode *t) const;//
int height(BSTNode *t) const;//
BSTNode * clone(BSTNode *t) const;//

};
#include "bst1.hpp"
}
#endif

そして、ここに bst1.hpp があります

template <typename T>
void BST<T>::buildFromInputString(const string input)
{
    //////////makeEmpty();
    cin >> input;

}

template <typename T>
BST<T>::~BST()
{
    makeEmpty();
}

/*template <typename T>
const BST<T>::BST & operator=(const BST & rhs)
{
    if (this != &rhs)
    {
        makeEmpty();
        root = clone( rhs.root)
    }
    return *this;
}*/

template <typename T>
bool BST<T>::empty()
{
//if (contains(root)==(-1)) 
if ( 1==1)  
    return true;
else
    return false;
}

template <typename T>
void BST<T>::printInOrder() const
{
    printInOrder(root);
}

/*template <typename T>
void BST<T>::printLevelOrder() const
{
    printLevelOrder(root);
}*/

template <typename T>
int BST<T>::numOfNodes() const
{
    return numOfNodes(root);
}
template <typename T>
int BST<T>::height() const
{
    return height(root);
}

template <typename T>
void BST<T>::makeEmpty()
{
    makeEmpty(root);
}

template <typename T>
void BST<T>::insert(const T& v)
{
    insert(v, root);
}

template <typename T>
void BST<T>::remove(const T& v)
{
    remove(v, root);
}

template <typename T>
bool BST<T>::contains(const T& v)
{
    return contains(v, root);
}

template <typename T>
bool BST<T>::contains(const T& v, BSTNode *&t)
{
    if( t == NULL)
        return false;
    else if(v < t->element)
        return contains(v, t->left);
    else if(t->element < v)
        return contains(v, t->right);
    else
        return true;
}

template <typename T>
int BST<T>::numOfNodes(BSTNode *t) const
{
    int nodes = 0;
    if (t!=NULL)
    {
        nodes++;
        numOfNodes(t->left);
        numOfNodes(t->right);
    }
    return nodes;
}

template <typename T>
void BST<T>::printInOrder(BSTNode *t) const
{

if (left != 0)
printInOrder(t->left);
cout << t << endl;
if (right != 0)
printInOrder(t->right);

}


//void BST<T>::printLevelOrder(BSTNode *t) const


template <typename T>
void BST<T>::makeEmpty(BSTNode * & t)
{
    if(t != NULL)
    {
        makeEmpty(t->left);
        makeEmpty(t->right);
        delete t;
    }
    t = NULL;
}

template <typename T>
void BST<T>::insert(const T& v, BSTNode *&t)
{
    if(t = NULL)
        t = new BSTNode(v, NULL, NULL);
    else if(v < t->element)
        insert(v,t->left);
    else if(t->element < v)
        insert(v,t->right);
    else
        ;
}

template <typename T>
void BST<T>::remove(const T& v, BSTNode *&t)
{
    if(t == NULL)
        return;
    if(v < t->element)
        remove(v, t->left);
    else if (t->element < v)
        remove(v,t->right);
    else
    {
        BSTNode *oldNode = t;
        t = (t->left != NULL) ? t->left : t->right;
        delete oldNode;
    }

}
//else if (t->left != NULL && t->right != NULL)



template <typename T>
int BST<T>::height(BSTNode *t) const
{
    return t == NULL ? -1: t->height;
}

template <class T>
typename BST<T>::BSTNode * BST<T>::clone(BSTNode *t) const
{
    if(t==NULL)
        return NULL;

    return new BSTNode( t->element, clone(t->left), clone(t->right));

}

リンカーに問題があります。私の問題に具体的に対処するコードがサイト上に見つかりませんでした。二分探索木に取り組んできましたが、この特定の側面を改善する結果はほとんどありませんでした。私に関する限り、すべてのライブラリとファイルがそれぞれの領域に追加されています。

4

3 に答える 3

0

テンプレートのインターフェースと実装を分離してはなりません。-file でメソッドを定義してください.h。そうしないと、コンパイラは具象型を作成できません。

于 2013-04-05T19:59:50.390 に答える