2014-10-13 5 views
0

У меня есть класс с структуры внутри него в заголовке .h:BinaryNode»не называет тип

template <typename DataType> 

class BST 
{ 
public: 
    struct BinaryNode 
    { 
     // variables 
    }; 
    //functions 
private: 
    BinaryNode *findMin(BinaryNode *t) const; //done 
    BinaryNode *findMax(BinaryNode *t) const; //done 
    //other functions and variables 
}; 

и когда я делаю реализацию этих функций в .cpp:

template <typename DataType> 
BinaryNode* BST<DataType>::findMin(BST<DataType>::BinaryNode<DataType> *t) 
{ 
    //do something 
} 

template <typename DataType> 
BinaryNode* BST<DataType>::findMax(BST<DataType>::BinaryNode<DataType> *t) 
{ 
    //do something 
} 

я получаю ошибку на BinaryNode* BST<DataType>::findMax(BST<DataType>::BinaryNode<DataType> *t) и findMin что BinaryNode does not name a type

Я попытался с помощью BinaryNode<Datatype> *, но это тоже имеет ту же ошибку.

ответ

2

Вы не указываете тип для возвращения параметр ваших функций, и вы дали параметр шаблона входному параметру BinaryNode.

template <typename DataType> 
class BST 
{ 
public: 
    struct BinaryNode 
    { 
     // variables 
    }; 
    //functions 
private: 
    BinaryNode *findMin(BinaryNode *t) const; //done 
    BinaryNode *findMax(BinaryNode *t) const; //done 
    //other functions and variables 
}; 

template <typename DataType> 
typename BST<DataType>::BinaryNode* BST<DataType>::findMin(BST<DataType>::BinaryNode *t) const 
{ 
    //do something 
} 

template <typename DataType> 
typename BST<DataType>::BinaryNode* BST<DataType>::findMax(BST<DataType>::BinaryNode *t) const 
{ 
    //do something 
} 

или укоротить входной параметр:

template <typename DataType> 
typename BST<DataType>::BinaryNode* BST<DataType>::findMax(BinaryNode *t) const 
{ 
    //do something 
} 

Обратите внимание, что возвращаемый параметр должен быть указан в полном объеме, так как, когда компилятор получает там еще не знает, что он читает реализацию функции для класс BST. Кроме того, typename требуется, так как BinaryNode в этом контексте - это имя, которое зависит от шаблона, и компилятор не может этого знать, если вы не сделаете его явным.

0

BinaryNode не входит в глобальное пространство имен. Кроме того, это не шаблонная структура, а просто структура внутри класса, которая, как правило, является шаблоном.

So BST<DataType>::BinaryNode - это то, что вы ищете снаружи тела шаблона BST класса. Вы можете просто ссылаться на него как на BinaryNode внутри BST, если вы имеете в виду BinaryNode для текущего расширения шаблона.

(И вы должны упомянуть, какой шаблон параметризация ваши определения об отсутствии на теле, соответствующие ..., как @ более полный ответ Svalorzen упоминает.)