c ++模板没有合适的默认构造函数

时间:2012-10-11 13:17:44

标签: c++ templates visual-c++

  

可能重复:
  Why should the implementation and the declaration of a template class be in the same header file?

希望你能帮助我。

我知道这个问题(在谷歌搜索之后)被问了数百万次。我确信我的问题的解决方案是数百万个问题中的一个,但我找不到,所以我决定问。

我特意得到这个错误:

  

错误1错误C2512:'NodeQueue':没有合适的默认构造函数可用a:\ work \ fast \ semi 5 \ automata \ assignments \ progass1 \ progass1 \ progass1 \ tree.h 33 1 progass1

特定的行有这个定义:

level=new NodeQueue<Node>;

也为下一行获得相同的错误,但原因是相同的..

我有一些默认的构造函数,不知道为什么会发生这种情况。以下是代码的一部分:

头文件的顶部:

#include <iostream>
using namespace std;

#include "intarr.h"
class Node;
template <typename t>
class QueueNode;

template <typename t>
class NodeQueue;

树:

class Tree{

    Node* root;


    int level_length;
    Node* curr;
    NodeQueue <Node>* level,*level_bak;
public:

    Tree(){
        root=NULL;
        level_length=0;
        curr=NULL;
        level=new NodeQueue<Node>;
        level_bak=new NodeQueue<Node>;
    }
// I doubt you need the rest...

类节点

class Node{
public:
    Node *top,*right,*bottom,*left,*prev;
    Node *a,*b,*c;
    int row,col;
    Node(){

    }
    Node(int x,int y){
        top=right=bottom=left=prev=NULL;
        row=x;col=y;
        a=b=c=NULL;
    }

};

queuenode(即队列的节点)

 template <typename t>
     class QueueNode {
     public:
        QueueNode* next;
        QueueNode* prev;

        t *value;
        QueueNode(){

        }
        QueueNode(t* value){
            next=NULL;
            this->value=value;
        }

    };

nodequeue:

 template <typename t>
 class NodeQueue {
    QueueNode *head;
    QueueNode *tail;

    //lhs=bottom;

 public:
     NodeQueue(){
        head=NULL;
        tail=NULL;
    }
//....... rest of the code you dont need

2 个答案:

答案 0 :(得分:3)

由于这是一个编译器错误(不是链接器,因为大多数模板错误问题),我猜这是因为你转发声明类型:

template <typename t>
class NodeQueue;

为什么要转发声明而不是包含文件?要构建对象,您需要完整定义,因此 #include "NodeQueue.h"

使用不需要完整类型的前向声明。

答案 1 :(得分:1)

根据MSDN Compiler Error C2512也是在您尝试创建未完成的类实例时生成的 - 前向声明,但完全定义不可用。

因此,您需要将NodeQueue定义标头添加到tree.h