C ++テンプレート化されたフレンドクラス
質問
C ++で2-3-4ツリーの実装を記述しようとしています。テンプレートを使用してからしばらく経ちましたが、エラーが発生しています。これが私の非常に基本的なコードフレームワークです。
node.h:
#ifndef TTFNODE_H
#define TTFNODE_H
template <class T>
class TreeNode
{
private:
TreeNode();
TreeNode(T item);
T data[3];
TreeNode<T>* child[4];
friend class TwoThreeFourTree<T>;
int nodeType;
};
#endif
node.cpp:
#include "node.h"
using namespace std;
template <class T>
//default constructor
TreeNode<T>::TreeNode(){
}
template <class T>
//paramerter receving constructor
TreeNode<T>::TreeNode(T item){
data[0] = item;
nodeType = 2;
}
TwoThreeFourTree.h
#include "node.h"
#ifndef TWO_H
#define TWO_H
enum result {same, leaf,lchild,lmchild,rmchild, rchild};
template <class T> class TwoThreeFourTree
{
public:
TwoThreeFourTree();
private:
TreeNode<T> * root;
};
#endif
TwoThreeFourTree.cpp:
#include "TwoThreeFourTree.h"
#include <iostream>
#include <string>
using namespace std;
template <class T>
TwoThreeFourTree<T>::TwoThreeFourTree(){
root = NULL;
}
そしてmain.cpp:
#include "TwoThreeFourTree.h"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ifstream inFile;
string filename = "numbers.txt";
inFile.open (filename.c_str());
int curInt = 0;
TwoThreeFourTree <TreeNode> Tree;
while(!inFile.eof()){
inFile >> curInt;
cout << curInt << " " << endl;
}
inFile.close();
}
そして、コマンドラインからコンパイルしようとすると: g ++ main.cpp node.cpp TwoThreeFourTree.cpp
次のエラーが表示されます:
In file included from TwoThreeFourTree.h:1,
from main.cpp:1:
node.h:12: error: ‘TwoThreeFourTree’ is not a template
main.cpp: In function ‘int main()’:
main.cpp:13: error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> class TwoThreeFourTree’
main.cpp:13: error: expected a type, got ‘TreeNode’
main.cpp:13: error: invalid type in declaration before ‘;’ token
In file included from node.cpp:1:
node.h:12: error: ‘TwoThreeFourTree’ is not a template
In file included from TwoThreeFourTree.h:1,
from TwoThreeFourTree.cpp:1:
node.h:12: error: ‘TwoThreeFourTree’ is not a template
主な質問は、なぜ「エラー:&#8216; TwoThreeFourTree&#8217;はテンプレートではありません」。誰にもアイデアはありますか?事前にすべてのアドバイス/ヘルプをありがとう... ダン
解決
friendキーワードを使用する場合、テンプレートとして宣言する必要があります。コードのフレンド宣言に誤った構文を使用しています。書きたいことは:
template <class U> friend class TwoThreeFourTree;
他のヒント
受け入れられた解決策には、同じインスタンス化タイプを共有するものだけでなく、 TwoThreeFourTree
テンプレートのインスタンス化に対してクラスを開くというわずかな問題があります。
同じタイプのインスタンス化に対してのみクラスを開く場合は、次の構文を使用できます:
template <typename T> class TwoThreeFourTree; // forward declare the other template
template <typename T>
class TreeNode {
friend class TwoThreeFourTree<T>;
// ...
};
template <typename T>
class TwoThreeFourTree {
// ...
};
所属していません StackOverflow