Re: What the heck?
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
::::: <john.femiani@gmail.com> 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