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:air<bool, Node<K> *> Search(K key);
};
I get several compile errors on the signature of the Search method implementation
template<typename K>
std:air<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:air<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:air'
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:air<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:air<bool, Tree23<K>::Node<K>*> Tree23<K>::Search(K)
Why, with typename added, does it think the prototype is 'int Tree23<K>::Search(K)'
#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:air<bool, Node<K> *> Search(K key);
};
I get several compile errors on the signature of the Search method implementation
template<typename K>
std:air<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:air<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:air'
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:air<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:air<bool, Tree23<K>::Node<K>*> Tree23<K>::Search(K)
Why, with typename added, does it think the prototype is 'int Tree23<K>::Search(K)'