By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,604 Members | 1,490 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,604 IT Pros & Developers. It's quick & easy.

What the heck?

P: n/a
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<intb;
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

Nov 7 '07 #1
Share this Question
Share on Google+
5 Replies


P: n/a
On 2007-11-07 03:06:04 -0500, John Femiani <jo**********@gmail.comsaid:
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<intb;
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

Nov 7 '07 #2

P: n/a
Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <jo**********@gmail.comsaid:
::
::: 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<intb;
::: 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
Nov 7 '07 #3

P: n/a
On 2007-11-07 19:12, Bo Persson wrote:
Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <jo**********@gmail.comsaid:
::
::: 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<intb;
::: 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
Nov 7 '07 #4

P: n/a
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
::::: <jo**********@gmail.comsaid:
:::::
:::::: 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<intb;
:::::: 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
Nov 7 '07 #5

P: n/a
On 2007-11-07 13:54:49 -0500, Erik Wikström <Er***********@telia.comsaid:
On 2007-11-07 19:12, Bo Persson wrote:
>Kira Yamato wrote:
:: On 2007-11-07 03:06:04 -0500, John Femiani
:: <jo**********@gmail.comsaid:
::
::: 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<intb;
::: 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

Nov 7 '07 #6

This discussion thread is closed

Replies have been disabled for this discussion.