2013-04-29 77 views
1

我的模板类与嵌套模板类这样签名返回嵌套模板的模板方法给出编译错误

#include <utility> 
template<typename K> class Tree23 { 

    public: 
    template<typename Key> class Node { 
     private: 
     friend class Tree23<K>;    
     // snip . . . 
    }; 
    Node<K> root; 
public:  
    // snip ...    
    std::pair<bool, Node<K> *> Search(K key); 
}; 

我得到的搜索方法实现的签名几个编译错误

template<typename K> 
std::pair<bool, Tree23<K>::Node<K> *> Tree23<K>::Search(K key) 
{ 
    // make sure tree has at least one element  
    if (root == 0) { 
      return std::make_pair(false, 0); 

    } else { 
      return Locate(key, root); 
    } 
}  

的误差对应于线

template<typename K> std::pair<bool, Tree23<K>::Node<K> *> Tree23<K>::Search(K key) 

的complie错误是:

Node.h:64:55: error: type/value mismatch at argument 2 in template parameter list for 'template<class _T1, class _T2> struct std::pair'  
    Node.h:64:55: error: expected a type, got '(Tree23<K>::Node < <expression error>)'  
    Node.h:64:58: error: expected unqualified-id before '>' token  
    Node.h:64:58: error: expected initializer before '>' token 

我不清楚如何解决这个问题。对于任何反馈,我们都表示感谢。

回答

2

试试这个:

template<typename K> 
std::pair<bool, typename Tree23<K>::template Node<K> *> Tree23<K>::Search(K key) 
//    ^^^^^^^^   ^^^^^^^^ 
{ 
    // make sure tree has at least one element 
    if (root == 0) { 
      return std::make_pair(false, 0); 

    } else { 
      return Locate(key, root); 
    } 
} 

而且check this out,为什么这是必要的。

+0

感谢您的回复。添加** typename **导致了一组不同的错误: Node.h:64:67:错误:模板参数2无效 Node.h:64:69:错误:原型为int Tree23 ::搜索(K)'不匹配'类中的任何一个Tree23 ' Node.h:57:44:error:candidate is:'std :: pair :: Node *> Tree23 :: Search (K)' 不知何故编译器现在认为原型是'int Tree23 :: Search(K)' – 2013-04-29 16:32:17

+0

我的错误。我会编辑。 – Fiktik 2013-04-29 17:34:36

+0

@Kurt现在它[为我编译](http://ideone.com/MLRFtI)。 – Fiktik 2013-04-29 17:36:57