【问题标题】:Undefined reference to 'Class<Type>::Class' [duplicate]对'Class<Type>::Class'的未定义引用[重复]
【发布时间】:2012-09-16 05:25:32
【问题描述】:

可能重复:
Why can templates only be implemented in the header file?

我以前碰到过这堵墙,但我不知道如何修复它。在 g++ 中,每当我尝试创建 BinaryTree 类的对象时都会出现此错误:

/home/bej0843/cs261/Assignment1/main.cpp:9: undefined reference to `BinaryTree<char>::BinaryTree()'

头文件的代码如下:

#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;



template<typename Type>
class BinaryTree
{
    public:
        struct TreeNode
        {
                Type nodeinfo;
                BinaryTree<Type> *left;
                BinaryTree<Type> *right;
        };
        BinaryTree();
        void setInfo(Type a);
        void setSubtree(Type a);
        bool isEmpty();
        Type Info();
        void inOrder();
        void preOrder();
        void postOrder();
        virtual ~BinaryTree();
    protected:
        TreeNode *root;
        stack<TreeNode*> s;
        stack<TreeNode*> temp;
    private:
      void postOrder(TreeNode *r);
};


#endif  /* BINARYTREE_H */

下面是它的实现代码:

#include "BinaryTree.h"

template <typename Type>
BinaryTree<Type>::BinaryTree(){

    root = NULL;
}

template <typename Type>
void BinaryTree<Type>::setInfo(Type a){
  root->nodeinfo = a;
  root->left = NULL;
  root->right = NULL;
  s.push(root);
}

template <typename Type>
void BinaryTree<Type>::setSubtree(Type a){
  root->nodeinfo = a;
  root->left->root = s.top();
  s.pop();
  root->right->root = s.top();
  s.pop();
  s.push(root);
}

template <typename Type>
bool BinaryTree<Type>::isEmpty(){
  return (root==NULL);
}

template <typename Type>
Type BinaryTree<Type>::Info(){
  return root->nodeinfo;
}

template <typename Type>
void BinaryTree<Type>::inOrder(){

  TreeNode *c;
  c = s.top();

  while (c!=NULL || (!temp.empty())){
    if (c!=NULL)
    {
    temp.push(c);
    c = c->left;
    }
    else{
      c = temp.top();
      temp.pop();
      cout << c->nodeinfo +" ";
      c = c->right;
    }
  }

}

template <typename Type>
void BinaryTree<Type>::postOrder(){
  postOrder(s.top());
}

template <typename Type>
void BinaryTree<Type>::postOrder(TreeNode *r){
  temp.push(s.top());
  TreeNode *c = temp.top();
  s.pop();
  postOrder(c->left->root);
  postOrder(c->right->root);
  cout << c->nodeinfo + " ";

}

template <typename Type>
void BinaryTree<Type>::preOrder(){
  TreeNode*c = s.top();
  while (c!=NULL||(!temp.empty())){
    if (c!=NULL){
      cout << c->nodeinfo + " ";
      temp.push(c);
      c=c->left;
    }
    else{
      c=temp.top();
      temp.pop();
      c=c->right;
    }
  }
}

template <typename Type>
BinaryTree<Type>::~BinaryTree(){

}

我主要调用:

BinaryTree<char> tree;

并得到错误。帮忙?

【问题讨论】:

    标签: c++ stack binary-tree undefined-reference


    【解决方案1】:

    在使用模板类时,您必须将类的实现和声明放在同一个文件中。

    编译器需要在使用模板类的地方生成代码。

    Dynamic Allocation in Template Class Constructor

    你可以这样做。

    template <typename T>
    class myClass
    {
       //public and private interface. 
    } ;
    
    //Here the implementation of the interface goes, just beneath the declaration.
    

    【讨论】:

    • 行得通!这让我想知道为什么我的教授说他更喜欢将实现放在单独的文件中。感谢您的帮助。
    【解决方案2】:

    当你编写模板化函数时

    template <typename Type>
    BinaryTree<Type>::BinaryTree(){
    
        root = NULL;
    }
    

    编译器在看到模板参数的实例化之前实际上不会为该函数生成代码。

    这就是为什么没有BinaryTree&lt;char&gt;::BinaryTree();编译器从未为此生成代码!原因是您的 char 实例位于定义此模板函数的单独编译单元(目标文件)中。

    要解决此问题,请将您的 main() 函数放在定义 BinaryTree 的所有成员函数的同一文件中,或者将成员函数放在声明类的头文件中。

    【讨论】:

      【解决方案3】:

      错误意味着链接器没有找到该类型的构造函数的定义。模板化代码中的主要原因是函数的定义(在这种情况下为构造函数)在实例化的位置不可用,并且没有执行显式实例化。简单的解决方案是在标头中提供模板的定义以使其可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 2013-11-08
        • 2013-03-20
        • 1970-01-01
        • 2013-01-19
        • 2012-07-29
        • 1970-01-01
        相关资源
        最近更新 更多