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

             Bug #: 56421
           Summary: Non-matching overload produces template substitution
                    error
    Classification: Unclassified
           Product: gcc
           Version: 4.7.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: kristian.spangs...@gmail.com


template<class S> struct Foo {
  typedef typename S::type type;
};

template<class> void foo();
template<class S> typename Foo<S>::type foo(int);

int main()
{
  foo<int>();
}


Produces the following error in both gcc-4.7.2 and gcc-4.6.3:

$ g++ -c t.cpp
t.cpp: In instantiation of ‘struct Foo<int>’:
t.cpp:6:41:   required by substitution of ‘template<class S> typename Foo::type
foo(int) [with S = int]’
t.cpp:10:12:   required from here
t.cpp:2:28: error: ‘int’ is not a class, struct, or union type


Clang accepts it as valid.


Note: No errors are reported by GCC if we change line 6 from

  template<class S> typename Foo<S>::type foo(int);

to

  template<class S> typename S::type foo(int);

Reply via email to