What the heck?

J

John Femiani

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
 
K

Kira Yamato

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.
 
B

Bo Persson

Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <[email protected]> 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
 
G

Guest

Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <[email protected]> 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.
 
K

Kira Yamato

Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <[email protected]> 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.
 
B

Bo Persson

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
::::: <[email protected]> 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
 

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

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,045
Latest member
DRCM

Latest Threads

Top