2016-05-02 14 views
0

Octreeのデータ構造をC++で作成したいと思います。関数ポインタを返す

class Octree 
{ 
public: 
    typedef struct node 
    { 
     int value; 
     node *child[8]; 
    }node; 

    Octree(); 
    ~Octree(); 

    int convert(int sorszam); 
    void clear(struct node*); 
    node* search(int dec,int oct); 
}; 

そして、私は.cppファイルの検索機能を書きたいのですが、私は常にエラーメッセージが表示されました:私はこのようにあるヘッダファイルを持っています。ここでの.cppコードです:

node* Octree::search(int dec, int oct) { 
//doing something here 
return nullptr; 
} 

は、エラーメッセージは言う:

宣言は(宣言した "検索(int型は12月、INT 10月)*オクトリー::オクトリー::ノード" と互換性がありません

2つの関数の型は、次のとおりです。同じ。私は間違って何をしていますか?

+5

を::代わりにノード*'ちょうど 'node *'のものです。また、typedefを削除することもできます。これはC++では必要ありません。 – Chad

+1

またはstructノードのtypedefをクラスの外に移動 –

+0

C++のように 'typedef'を取り除くこともできます。' struct'を使って 'struct'の名前を修飾する必要はありません。 – NathanOliver

答えて

2

ノード用typedefは、クラスにスコープされます。あなたはクラス本体の

node* Octree::search(int dec, int oct) 

外を使用する場合、コンパイラは、私たちは、クラスの範囲外であるように、ノードが何であるかを知りません。あなたは、これは、コンパイラはクラスからnodeを使用することができます

Octree::node* Octree::search(int dec, int oct) 

のようなクラス名でnodeを修飾する必要があります。 Octree


nodetypedefを使用する理由はありません。 Cとは異なり、structを使用する場合は、structキーワードを使用する必要はありません。あなたは

class Octree 
{ 
public: 
    struct node 
    { 
     int value; 
     node *child[8]; 
    }; 
    //... 
}; 

を持つことができ、その後、あなたはちょうどあなたがtypedefの場合と同じようnodeを使用することができます。

+0

ありがとうございました。今は絶対に明白です! –

2

2つの機能のタイプが同じであるため、何が起こっているのかわかりません。

タイプはではなく、と同じです。 Octreeの定義内では、ネストされたクラスnodeを定義しています。したがって、Octreeの定義内では、タイプ名nodeOctree::nodeを指します。ただし、Octree(メンバー関数を定義した)の定義の外では、nodeOctree::nodeを参照していません。これは::nodeを指し、他の場所で宣言されている可能性があります。

私は間違っていますか?

返されると宣言されたものとは異なる戻り値の型でメンバ関数を(誤って)宣言しています。単に正しい型を参照するために、完全修飾名を使用します。

Octree::node* Octree::search(int dec, int oct) 
+0

ありがとう!今はっきりしています –

2

エラーは、実際にnodeという型を宣言していないためです。 Octree::nodeという型を宣言しました。 Octree::search関数の定義はクラス宣言の外にされているので、あなたがタイプの完全修飾名を使用する必要があります。CPPに `オクトリーに戻り値の型を変更してみてください

Octree::node* Octree::search(int dec, int oct) { 
...