2012-01-06 2 views
3

Следующий код не компилируется, почему это так? И как я могу это исправить?Ошибка вызова метода шаблона в «templated-base-class»

struct A{ 
    template<int N> int get() { return N; } 
}; 

template <typename X> 
struct B : public X { 
    template<int N> int get() { 
     return X::get<N>(); 
    } 
}; 

int main(int argc, const char *argv[]) 
{ 
    B<A> b; 
    return b.get<5>(); 
} 

Compiler ошибка:

test.cxx: In member function ‘int B<X>::get()’: 
test.cxx:8:30: error: expected primary-expression before ‘)’ token 
test.cxx: In member function ‘int B<X>::get() [with int N = 5, X = A]’: 
test.cxx:15:25: instantiated from here 
test.cxx:8:30: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’ 

ответ

5

вы должны неоднозначность его, вот так:

template<int N>int get() { 
    return X::template get<N>(); 
} 
+0

Почему существует потребность в неоднозначности? OP строго вызывает 'X :: get ();' –

+5

@sad_man: Без экземпляра X во время первого прохода мы не знаем, что 'get' является шаблоном-членом. 'X :: get ()' интерпретируется как 'X :: get less_than N больше_than()', что является ошибкой. – visitor

+4

@sad_man: В принципе, правила C++ не позволяют ситуации, когда один и тот же код может означать как вызов шаблона функции-члена, так и серию сравнений, в зависимости от специализации X. (VC++ ошибается, AFAIK.) – visitor

 Смежные вопросы

  • Нет связанных вопросов^_^