Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Weird template problem: Conflicting return type specified (http://www.velocityreviews.com/forums/t290578-weird-template-problem-conflicting-return-type-specified.html)

Ton van den Heuvel 04-28-2005 01:03 PM

Weird template problem: Conflicting return type specified
 
Hi all,

why does the following code not compile, and fail with:

qed.cpp: In instantiation of `B<Foo*>':
qed.cpp:40: instantiated from here
qed.cpp:29: error: conflicting return type specified for `const T
B<T>::Test()
const [with T = Foo*]'
qed.cpp:14: error: overriding `virtual const Foo* A::Test() const'

------------------------

#include <iostream>



struct Foo {
int val;
};

class A {
public:
A( void ) {
}

virtual const Foo* Test( void ) const {
return NULL;
}
protected:
Foo foo;
};



template< class T >
class B : A {
public:
B( void ) {
}

const T Test( void ) const {
return NULL;
}
protected:
T foo;
};



int main( void ) {
A a;
B< Foo* > b;
}


-----------------------

I don't see a problem here. Both MSVC and GCC complain about the code
in a similar way, so there is a fundamental problem here, but I can't
figure out what the problem is. Any hints?

Regards,
Ton van den Heuvel

Victor Bazarov 04-28-2005 01:16 PM

Re: Weird template problem: Conflicting return type specified
 
Ton van den Heuvel wrote:
> why does the following code not compile, and fail with:
>
> qed.cpp: In instantiation of `B<Foo*>':
> qed.cpp:40: instantiated from here
> qed.cpp:29: error: conflicting return type specified for `const T
> B<T>::Test()
> const [with T = Foo*]'
> qed.cpp:14: error: overriding `virtual const Foo* A::Test() const'


'const T' where 'T' is Foo*

and

'const Foo*'

are different types. The former is actually

'T const'

or, expanded,

'Foo * const'

..

>
> ------------------------
>
> #include <iostream>
>
>
>
> struct Foo {
> int val;
> };
>
> class A {
> public:
> A( void ) {
> }
>
> virtual const Foo* Test( void ) const {
> return NULL;
> }
> protected:
> Foo foo;
> };
>
>
>
> template< class T >
> class B : A {
> public:
> B( void ) {
> }
>
> const T Test( void ) const {
> return NULL;
> }
> protected:
> T foo;
> };
>
>
>
> int main( void ) {
> A a;
> B< Foo* > b;
> }
>
>
> -----------------------
>
> I don't see a problem here.


That happens.

> Both MSVC and GCC complain about the code
> in a similar way, so there is a fundamental problem here, but I can't
> figure out what the problem is. Any hints?


Try to see the difference between

typedef int* pint;
const pint somepointer;

and

const int* somepointer;

This should be enough of a hint (if a hint is what you want).

V

roberth+news@ifi.uio.no 04-28-2005 01:20 PM

Re: Weird template problem: Conflicting return type specified
 
Ton van den Heuvel <tonvandenheuvel@gmail.com> wrote:
| Hi all,
|
| why does the following code not compile, and fail with:
|
| qed.cpp: In instantiation of `B<Foo*>':
| qed.cpp:40: instantiated from here
| qed.cpp:29: error: conflicting return type specified for `const T
| B<T>::Test()
| const [with T = Foo*]'
| qed.cpp:14: error: overriding `virtual const Foo* A::Test() const'
|
| ------------------------
|
| #include <iostream>
|
|
|
| struct Foo {
| int val;
| };
|
| class A {
| public:
| A( void ) {
| }
|
| virtual const Foo* Test( void ) const {
| return NULL;
| }
| protected:
| Foo foo;
| };
|
|
|
| template< class T >
| class B : A {
| public:
| B( void ) {
| }
|
| const T Test( void ) const {
| return NULL;
| }
| protected:
| T foo;
| };
|
|
|
| int main( void ) {
| A a;
| B< Foo* > b;
| }
|
|
| -----------------------
|
| I don't see a problem here. Both MSVC and GCC complain about the code
| in a similar way, so there is a fundamental problem here, but I can't
| figure out what the problem is. Any hints?

Yes. Templates are not macros. "const T" with "T = Foo*" is the same as
"Foo * const." That means the pointer is const, not the value pointed to,
and you are trying to override "const Foo* A::Test() const" with "Foo *
const B<Foo*>::Test() const."
--
Robert Bauck Hamar

tonvandenheuvel@gmail.com 05-01-2005 06:48 PM

Re: Weird template problem: Conflicting return type specified
 
Thanks for the helpful replies. I always considered templates to be
some sort of a macro, I was wrong :)



All times are GMT. The time now is 08:19 AM.

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