0

重複の可能性:
テンプレート クラスの実装と宣言を同じヘッダー ファイルに含める必要があるのはなぜですか?

あなたが私を助けてくれることを望んでいました。

この質問は (Google 検索を行った後) 何百万回も聞かれていることを知っています。私の問題の解決策は、何百万もの質問の 1 つにあると確信していますが、それを見つけることができなかったので、質問することにしました。

具体的には次のエラーが表示されます。

エラー 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;
        }

    };

ノードキュー:

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

    //lhs=bottom;

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

2 に答える 2

3

これはコンパイラ エラー (ほとんどのテンプレート エラーの質問のようにリンカーではありません) であるため、型を前方宣言しているためだと思います。

template <typename t>
class NodeQueue;

ファイルを含める代わりに、なぜ前方宣言するのですか? オブジェクトを構築するには、完全な定義が必要です#include "NodeQueue.h"

完全な型が必要ない場合は、前方宣言を使用してください。

于 2012-10-11T13:23:10.517 に答える
1

MSDNによると、コンパイラエラーC2512は、完全ではないクラスのインスタンスを作成しようとしたときにも生成されます-前方宣言されていますが、完全な定義は利用できません。

NodeQueueしたがって、定義ヘッダーをに含める必要がありますtree.h

于 2012-10-11T13:27:01.250 に答える