Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Signature of a template method that returns a nested template typegives compile errors (http://www.velocityreviews.com/forums/t960209-signature-of-a-template-method-that-returns-a-nested-template-typegives-compile-errors.html)

kurt krueckeberg 04-29-2013 04:41 PM

Signature of a template method that returns a nested template typegives compile errors
 
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)'

Victor Bazarov 04-29-2013 05:58 PM

Re: Signature of a template method that returns a nested templatetype gives compile errors
 
On 4/29/2013 12:41 PM, kurt krueckeberg wrote:
> 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
--
I do not respond to top-posted replies, please don't ask


All times are GMT. The time now is 08:12 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.