Kurt Krueckeberg
Kurt Krueckeberg

Reputation: 1245

Signature of a template method that returns a nested template gives compile error

I have template class with a nested template class like this

#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);
};

I get several compile errors on the signature of the Search method implementation

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);
    }
}    

The errors correspond to the line

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

The complie errors are:

  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

I'm unclear how to fix this. Any feedback would be appreciated.

Upvotes: 1

Views: 149

Answers (1)

Fiktik
Fiktik

Reputation: 1941

Try this:

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);
    }
}

Also check this out as to why this is necessary.

Upvotes: 2

Related Questions