Compile error: unresolved overloaded function type

匿名 (未验证) 提交于 2019-12-03 01:34:02

问题:

I try to compile the following with g++ 4.7.2:

template <typename T> struct A {     struct B {         T t;          template<T B::*M>         T get() {             return this->*M;         }     };      B b;      T get() {         return b.get<&B::t>();     } };   int main() {     A<int> a;     a.get(); } 

It gives me

test.cpp: In member function ‘T A<T>::get()’: test.cpp:15:23: error: expected primary-expression before ‘)’ token test.cpp: In instantiation of ‘T A<T>::get() [with T = int]’: test.cpp:22:8:   required from here test.cpp:15:23: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int A<int>::B::*’ to binary ‘operator<’ 

Why?

Thanks.

回答1:

You need to use the template disambiguator:

return b.template get<&B::t>(); 

Without it, when parsing the expression:

b.get<&B::t>(); 

The compiler can't tell whether it should interpret get as the name of a member variable followed by a < sign (less-than), or as the instantiation of a member function template called get.

Although we know what is the intended meaning of our expression, the compiler cannot, at least not before instantiation occurs - and syntactic parsing is performed even though your function is never instantiated.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!