我上了一堂课:
template <typename T>
class btree {
public:
btree(size_t maxNodeElems);
~btree() {}
struct node {
list <T> elements;
node *lvl;
};
private:
size_t maxNodeElems;
node* root;
};
template <typename T>
btree<T>::btree(size_t maxNodeElems) {
if (maxNodeElems > 0) maxNodeElems = maxNodeElems;
root = new node;
root->lvl = new node[maxNodeElems+1];
}
template <typename T>
pair <typename btree<T>::iterator, bool> btree <T>::insert (const T& elem) {
pair <btree<T>::node, bool> start;
start = addElement (elem, *root);
pair <typename btree<T>::iterator, bool> final;
return final;
}
template <typename T>
pair <btree<T>::node, bool> btree<T>::addElement (const T& e, btree<T>::node*& n) {
n->elements.push_back(e);
return make_pair(*n, true);
}
它一直给出的错误是:
error: expected a type, got 'btree::node'
error: invalid type in declaration before ';' token
At global scope:
error: type/value mismatch at argument 1 in template parameter list for 'template<class _T1, class _T2> struct std::pair'
error: expected a type, got 'btree::node'
这似乎正在线上发生:
pair <btree<T>::node, bool> btree<T>::addElement (const T& e, btree<T>::node*& n) {
我在标题中以相同的方式调用它,我不明白为什么它说我没有给它正确的类型。有人可以向我解释一下吗?
答案 0 :(得分:5)
你必须说:
pair <typename btree<T>::node, bool>
^^^^^^^^
这是因为在模板设置中,btree<T>
未解析且btree<T>::node
是依赖名称,您需要消除歧义。
答案 1 :(得分:3)
这是一个非常常见的错误。
将typename
用作:
pair<typename btree<T>::node, bool>
^^^^^^^^
这是因为node
是依赖类型,因为依赖模板参数T
。
答案 2 :(得分:3)
您需要使用typename
告诉编译器依赖名称定义类型:
template <typename T>
pair <typename btree<T>::node, bool> btree<T>::addElement (const T& e, typename btree<T>::node*& n)