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<’
Почему существует потребность в неоднозначности? OP строго вызывает 'X :: get();' –
@sad_man: Без экземпляра X во время первого прохода мы не знаем, что 'get' является шаблоном-членом. 'X :: get()' интерпретируется как 'X :: get less_than N больше_than()', что является ошибкой. –
visitor
@sad_man: В принципе, правила C++ не позволяют ситуации, когда один и тот же код может означать как вызов шаблона функции-члена, так и серию сравнений, в зависимости от специализации X. (VC++ ошибается, AFAIK.) – visitor