2013-03-28 4 views
4

Я пытаюсь скомпилировать следующий с г ++ 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(); 
} 

Это дает мне

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<’ 

Почему?

Спасибо.

ответ

8

Вы должны использовать template disambiguator:

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

Без него, при разборе выражение:

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

Компилятор не может сказать, следует ли интерпретировать get как имя член переменной, за которой следует знак < (меньше), или как экземпляр шаблона функции-члена, который называется get.

we знаю, каково предполагаемое значение нашего выражения, компилятор не может, по крайней мере, не до создания экземпляра, и синтаксический синтаксический анализ выполняется даже при том, что ваша функция никогда не создается.

+0

И как раз когда вы знаете C++ ... Когда я должен использовать «шаблонную неоднозначность»? (Я просто искал, но я не могу найти хороший ответ на это.) –

+2

@PaulDraper: На самом деле, я нашел [этот вопрос и ответы] (http://stackoverflow.com/questions/610245/where-and-why -do-i-have-to-put-the-template-and-typename-keywords), который должен объяснить это довольно хорошо. –

+1

Отлично. Это также включает объяснение «typename», которое я также не полностью понял. –