Bug in template parsing?

lh mouse lh_mouse@126.com
Wed Jun 15 01:55:00 GMT 2016


Without the `template` keyword the compiler is unable to tell what entity 'T().f' is. It could legally be accessing a data member of a temporary object.
As a result, the C++ standard specifies that whatever (unprefixed) name that is dependent on a template parameter hence is unable to be identified in the template definition should be treated as a non-template.
In your example, the first < was considered not following a template name and was parsed as the builtin less-than operator rather than an angle bracket, hence the error.

(This is also the principle why the `typename` keyword is needed before a dependent type. You are gonna need both in the case of a dependent class template.)


------------------				 
Best regards,
lh_mouse
2016-06-15

-------------------------------------------------------------
发件人:Marcel Keller <M.Keller@bristol.ac.uk>
发送日期:2016-06-15 05:26
收件人:gcc-help
抄送:
主题:Bug in template parsing?

Hi,

Trying to compile the attached code with GCC 5.3.0 gives the error:

templ_bug.cpp: In function ‘void g()’:
templ_bug.cpp:15:12: error: expected primary-expression before ‘)’ token
    T().f<t>();
             ^
templ_bug.cpp: In instantiation of ‘void g() [with T = A; int t = 0]’:
templ_bug.cpp:19:10:   required from here
templ_bug.cpp:15:8: error: invalid operands of types ‘<unresolved 
overloaded function type>’ and ‘int’ to binary ‘operator<’
    T().f<t>();
         ^

However, if I uncomment the commented line, it works fine. I cannot 
understand why this should make a difference. Is there a mistake in the 
code or a bug in GCC?

Best regards,
Marcel





More information about the Gcc-help mailing list