Я хочу использовать шаблонную функцию базового класса, например так:
struct A {
template <class T> static auto f() { \*code*\ }
};
template <class A_type> struct B : public A_type {
using A_type::f;
void g() { auto n = f<int>(); }
};
Это не компилируется однако.
error: expected '(' for function-style cast or type
construction
void g() { auto n = f<int>(); }
~~~^
error: expected expression
void g() { auto n = f<int>(); }
Но ссылка на базовый класс напрямую вместо шаблона работает:
struct A {
template <class T> static auto f() { \*code*\ }
};
template <class A_type> struct B : public A_type {
using A::f;
void g() { auto n = f<int>(); }
};
Почему первая версия не компилируется, а вторая — нет. И что мне нужно сделать по-другому, чтобы это работало?
Компилятор не знает, что f
в f<int>()
это шаблон, отсюда и сообщение об ошибке.
Вы можете сделать это без using
вот так:
struct A {
template <class T> static auto f() { /*code*/ }
};
template <class A_type> struct B : public A_type {
void g() { auto n = A_type::template f<int>(); }
};
Других решений пока нет …