ج ++ قالب صديق الطبقة
سؤال
وأنا أحاول كتابة تنفيذ شجرة 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();
}
وعندما أحاول ترجمة من سطر الأوامر مع: ز ++ 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
وسؤالي الرئيسي هو السبب في انه قائلا: "الخطأ: 'TwoThreeFourTree' ليس قالب". هل لديها أي أفكار؟ شكرا لجميع النصائح / مساعدة مقدما ... دان
المحلول
وتحتاج فقط لنعلن على أنها نموذج عند استخدام صديق الكلمة. كنت تستخدم جملة غير صحيح لإعلان صديق في التعليمات البرمجية. ما كنت تريد أن تكتب هو:
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 {
// ...
};