Signature of a template method that returns a nested template typegives compile errors


K

kurt krueckeberg

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 also tried adding typename to the signature

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

This gave a different set of errors

Node.h:57:48: error: 'typename Tree23<K>::Node' names 'template<class K> template<class Key> class Tree23<K>::Node', which is not a type
Node.h:64:67: error: template argument 2 is invalid
Node.h:64:70: error: prototype for 'int Tree23<K>::Search(K)' does not match any in class 'Tree23<K>'
Node.h:57:53: error: candidate is: std::pair<bool, Tree23<K>::Node<K>*> Tree23<K>::Search(K)

Why, with typename added, does it think the prototype is 'int Tree23<K>::Search(K)'
 
Ad

Advertisements

V

Victor Bazarov

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

This one will attempt to generate a template with 'bool,int' as its
arguments, not with 'bool, Tree23...' as you want. You need to
explicitly cast the null to your value type. Better yet, create the
typedefs for the types of 'value' and 'key' in your class. Take a hint
from standard containers (see the 'value_type' etc. typedefs)
} else {
return Locate(key, root);

'Locate' is undeclared here.
}
}


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 also tried adding typename to the signature

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

This gave a different set of errors

Node.h:57:48: error: 'typename Tree23<K>::Node' names 'template<class K> template<class Key> class Tree23<K>::Node', which is not a type
Node.h:64:67: error: template argument 2 is invalid
Node.h:64:70: error: prototype for 'int Tree23<K>::Search(K)' does not match any in class 'Tree23<K>'
Node.h:57:53: error: candidate is: std::pair<bool, Tree23<K>::Node<K>*> Tree23<K>::Search(K)

Why, with typename added, does it think the prototype is 'int Tree23<K>::Search(K)'

Tree23<K>::Node is not a type, you can't use it after 'typename'.
'...Node' is actually a template-id, it needs template arguments to
become a *type*.

Post a short *complete* example so we could copy-and-paste it to compile
*and edit* if you really want our help.

V
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top