hello,

the following program fails to correctly find the right overloaded global
template function f(). clearly ::f() called within test::f() depends on a
template parameter so lookup should be postponed to the point of instantiation
which is not the case.
if template <class X> void f(X& x, const char& y) is moved so that its
definition appears before definition of class test, the output is correct.
this problem seems to be there since gcc3.4


#include <string>
#include <iostream>


template <class X, class Y>
void f(X& x, const Y& y) {
        std::cout << "global: " << x.id() << " " << y <<std::endl;
}



struct test {
        std::string id() const { return "test"; }

        template <class Y>
        void f(const Y& y) {
                ::f(*this,y);
        }
};



template <class X>
void f(X& x, const char& y) {
        std::cout << "global(char): " << x.id() << " " << y <<std::endl;
}


int main() {
        test it;
        it.f(2);
        it.f('a'); //doesn't call overloaded ::f(X&, const char&)
}


-- 
           Summary: name lookup and partial ordering
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: cerdeira at co dot sapo dot pt


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

Reply via email to