[Bug c++/33041] New: g++ incorrectly resolves an identically named templated struct in a super class

matthijs at bomhoff dot nl gcc-bugzilla@gcc.gnu.org
Fri Aug 10 09:47:00 GMT 2007


The following code compiles, but produces an incorrect result. I think this is
because g++ seems to incorrectly determine which templated struct foo should be
used (the one at the namespace level versus the member struct in bar). The two
lines in main() should produce the same result I think, but do not in practice.

The code should, when executed, produce "2\n2\n" I think, but it produces
"1\n2\n", showing an incorrect resolving of foo<double> in the first line of
main().

Reproducable using 3.3 and 4.0 on OS X as well.


Test case code:

#include <iostream>

struct bar {
        typedef bar type;

        template <typename A>
        struct foo {
                static const int value = 2;
        };
};

template <typename B>
struct foo : bar {
        static const int value = 1;
};

int main() {
        // foo<int> is the foo struct at namespace level, foo<double> should be
the foo struct within bar, but it is not in g++
        std::cout << foo<int>::foo<double>::value << std::endl;

        // foo<int> is again the foo struct at namespace level, ::type
explicitly takes its superclass so foo<double> is the foo struct within bar.
        std::cout << foo<int>::type::foo<double>::value << std::endl;
}


-- 
           Summary: g++ incorrectly resolves an identically named templated
                    struct in a super class
           Product: gcc
           Version: 4.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: matthijs at bomhoff dot nl
GCC target triplet: i486-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33041



More information about the Gcc-bugs mailing list