Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > What the heck?

Reply
Thread Tools

What the heck?

 
 
John Femiani
Guest
Posts: n/a
 
      11-07-2007
My message does not show up at all. Here it is again:

IN g++ 3.4.2 this does not compile:

#include <iostream>


template<class T>
struct A {
int member;
};

emplate<class T>
struct B: A<T>
{
void somefunc() {
std::cout << member << std::endl;
}
};


int main(int argc, char* argv[]){
B<int> b;
b.somefunc();
}


But it does on vc8.

Should this compile? Is there a bug on vc8? or g++?

g++ gives this error message:

test.cpp:15: error: `member' undeclared (first use this function)

replacing line 15 by:

std::cout << this->member << std::endl;
fixes it.

Also if I make A and B _not_ use templates all is fine.

My question is, is this a g++ bug or a vc8 bug?

-- John

 
Reply With Quote
 
 
 
 
Kira Yamato
Guest
Posts: n/a
 
      11-07-2007
On 2007-11-07 03:06:04 -0500, John Femiani <(E-Mail Removed)> said:

> My message does not show up at all. Here it is again:
>
> IN g++ 3.4.2 this does not compile:
>
> #include <iostream>
>
>
> template<class T>
> struct A {
> int member;
> };
>
> emplate<class T>
> struct B: A<T>
> {
> void somefunc() {
> std::cout << member << std::endl;
> }
> };
>
>
> int main(int argc, char* argv[]){
> B<int> b;
> b.somefunc();
> }
>
>
> But it does on vc8.
>
> Should this compile? Is there a bug on vc8? or g++?
>
> g++ gives this error message:
>
> test.cpp:15: error: `member' undeclared (first use this function)
>
> replacing line 15 by:
>
> std::cout << this->member << std::endl;
> fixes it.
>
> Also if I make A and B _not_ use templates all is fine.
>
> My question is, is this a g++ bug or a vc8 bug?
>
> -- John


You just discovered the "two-stage name lookup" with "dependent" and
"non-dependent" names.

The answer is in here: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html

It works on VC because, as I've been told, VC does not quite follow the
standard.

--

-kira

 
Reply With Quote
 
 
 
 
Bo Persson
Guest
Posts: n/a
 
      11-07-2007
Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <(E-Mail Removed)> said:
::
::: My message does not show up at all. Here it is again:
:::
::: IN g++ 3.4.2 this does not compile:
:::
::: #include <iostream>
:::
:::
::: template<class T>
::: struct A {
::: int member;
::: };
:::
::: emplate<class T>
::: struct B: A<T>
::: {
::: void somefunc() {
::: std::cout << member << std::endl;
::: }
::: };
:::
:::
::: int main(int argc, char* argv[]){
::: B<int> b;
::: b.somefunc();
::: }
:::
:::
::: But it does on vc8.
:::
::: Should this compile? Is there a bug on vc8? or g++?
:::
::: g++ gives this error message:
:::
::: test.cpp:15: error: `member' undeclared (first use this function)
:::
::: replacing line 15 by:
:::
::: std::cout << this->member << std::endl;
::: fixes it.
:::
::: Also if I make A and B _not_ use templates all is fine.
:::
::: My question is, is this a g++ bug or a vc8 bug?
:::
::: -- John
::
:: You just discovered the "two-stage name lookup" with "dependent"
:: and "non-dependent" names.
::
:: The answer is in here:
:: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html
::
:: It works on VC because, as I've been told, VC does not quite
:: follow the standard.

Not following the standard is considered an extension, so you have to
select the "Disable Language Extensions" option (/Za).


Bo Persson


 
Reply With Quote
 
=?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=
Guest
Posts: n/a
 
      11-07-2007
On 2007-11-07 19:12, Bo Persson wrote:
> Kira Yamato wrote:
> :: On 2007-11-07 03:06:04 -0500, John Femiani
> :: <(E-Mail Removed)> said:
> ::
> ::: My message does not show up at all. Here it is again:
> :::
> ::: IN g++ 3.4.2 this does not compile:
> :::
> ::: #include <iostream>
> :::
> :::
> ::: template<class T>
> ::: struct A {
> ::: int member;
> ::: };
> :::
> ::: emplate<class T>
> ::: struct B: A<T>
> ::: {
> ::: void somefunc() {
> ::: std::cout << member << std::endl;
> ::: }
> ::: };
> :::
> :::
> ::: int main(int argc, char* argv[]){
> ::: B<int> b;
> ::: b.somefunc();
> ::: }
> :::
> :::
> ::: But it does on vc8.
> :::
> ::: Should this compile? Is there a bug on vc8? or g++?
> :::
> ::: g++ gives this error message:
> :::
> ::: test.cpp:15: error: `member' undeclared (first use this function)
> :::
> ::: replacing line 15 by:
> :::
> ::: std::cout << this->member << std::endl;
> ::: fixes it.
> :::
> ::: Also if I make A and B _not_ use templates all is fine.
> :::
> ::: My question is, is this a g++ bug or a vc8 bug?
> :::
> ::: -- John
> ::
> :: You just discovered the "two-stage name lookup" with "dependent"
> :: and "non-dependent" names.
> ::
> :: The answer is in here:
> :: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html
> ::
> :: It works on VC because, as I've been told, VC does not quite
> :: follow the standard.
>
> Not following the standard is considered an extension, so you have to
> select the "Disable Language Extensions" option (/Za).


Actually, it is my understanding that two-phase lookup is simply not
implemented.

--
Erik Wikström
 
Reply With Quote
 
Kira Yamato
Guest
Posts: n/a
 
      11-07-2007
On 2007-11-07 13:54:49 -0500, Erik Wikström <(E-Mail Removed)> said:

> On 2007-11-07 19:12, Bo Persson wrote:
>> Kira Yamato wrote:
>> :: On 2007-11-07 03:06:04 -0500, John Femiani
>> :: <(E-Mail Removed)> said:
>> ::
>> ::: My message does not show up at all. Here it is again:
>> :::
>> ::: IN g++ 3.4.2 this does not compile:
>> :::
>> ::: #include <iostream>
>> :::
>> :::
>> ::: template<class T>
>> ::: struct A {
>> ::: int member;
>> ::: };
>> :::
>> ::: emplate<class T>
>> ::: struct B: A<T>
>> ::: {
>> ::: void somefunc() {
>> ::: std::cout << member << std::endl;
>> ::: }
>> ::: };
>> :::
>> :::
>> ::: int main(int argc, char* argv[]){
>> ::: B<int> b;
>> ::: b.somefunc();
>> ::: }
>> :::
>> :::
>> ::: But it does on vc8.
>> :::
>> ::: Should this compile? Is there a bug on vc8? or g++?
>> :::
>> ::: g++ gives this error message:
>> :::
>> ::: test.cpp:15: error: `member' undeclared (first use this function)
>> :::
>> ::: replacing line 15 by:
>> :::
>> ::: std::cout << this->member << std::endl;
>> ::: fixes it.
>> :::
>> ::: Also if I make A and B _not_ use templates all is fine.
>> :::
>> ::: My question is, is this a g++ bug or a vc8 bug?
>> :::
>> ::: -- John
>> ::
>> :: You just discovered the "two-stage name lookup" with "dependent"
>> :: and "non-dependent" names.
>> ::
>> :: The answer is in here:
>> :: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html
>> ::
>> :: It works on VC because, as I've been told, VC does not quite
>> :: follow the standard.
>>
>> Not following the standard is considered an extension, so you have to
>> select the "Disable Language Extensions" option (/Za).

>
> Actually, it is my understanding that two-phase lookup is simply not
> implemented.


From the same link above, I quote,

"This distinction between lookup of dependent and non-dependent names
is called two-stage (or dependent) name lookup. G++ implements it since
version 3.4."

I'm running g++ 4.0.1, but I have not written any code to test it yet.
But the OP seems to have tested it on g++ 3.4.2.

--

-kira

 
Reply With Quote
 
Bo Persson
Guest
Posts: n/a
 
      11-07-2007
Erik Wikström wrote:
:: On 2007-11-07 19:12, Bo Persson wrote:
::: Kira Yamato wrote:
::::: On 2007-11-07 03:06:04 -0500, John Femiani
::::: <(E-Mail Removed)> said:
:::::
:::::: My message does not show up at all. Here it is again:
::::::
:::::: IN g++ 3.4.2 this does not compile:
::::::
:::::: #include <iostream>
::::::
::::::
:::::: template<class T>
:::::: struct A {
:::::: int member;
:::::: };
::::::
:::::: emplate<class T>
:::::: struct B: A<T>
:::::: {
:::::: void somefunc() {
:::::: std::cout << member << std::endl;
:::::: }
:::::: };
::::::
::::::
:::::: int main(int argc, char* argv[]){
:::::: B<int> b;
:::::: b.somefunc();
:::::: }
::::::
::::::
:::::: But it does on vc8.
::::::
:::::: Should this compile? Is there a bug on vc8? or g++?
::::::
:::::: g++ gives this error message:
::::::
:::::: test.cpp:15: error: `member' undeclared (first use this
:::::: function)
::::::
:::::: replacing line 15 by:
::::::
:::::: std::cout << this->member << std::endl;
:::::: fixes it.
::::::
:::::: Also if I make A and B _not_ use templates all is fine.
::::::
:::::: My question is, is this a g++ bug or a vc8 bug?
::::::
:::::: -- John
:::::
::::: You just discovered the "two-stage name lookup" with "dependent"
::::: and "non-dependent" names.
:::::
::::: The answer is in here:
::::: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html
:::::
::::: It works on VC because, as I've been told, VC does not quite
::::: follow the standard.
:::
::: Not following the standard is considered an extension, so you
::: have to select the "Disable Language Extensions" option (/Za).
::
:: Actually, it is my understanding that two-phase lookup is simply
:: not implemented.

Not properly, no. But this is about finding members of dependent base
classes, which is implemented (if you ask for it).

The usual problem is, of course, that if you use /Za windows.h doesn't
compile.


Bo Persson


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments