We can simplify your failing example down to:
template
struct Base { using type = T; };
template
struct Derived : Base
{
type mem; // error: 'type' does not name a type
};
The issue is that type
here is a dependent name. It depends on T
. There is no guarantee that for a given T
there isn't some specialization of Base
which does not name type
. As such, base templates of class templates are not part of the standard name lookup, so you have to qualify it:
Base::type mem;
Although now we run afoul of the rule which indicates that dependent names are not assumed to be types unless explicitly states as such, so you need:
typename Base::type mem;
None of the other cases presented in the OP rely upon unqualified lookup of a dependent name.
To return to the specific problem, this doesn't compile:
static result_type apply(input_type i) {
because result_type
and input_type
are dependent types and so must be qualified and prefixed with typename
:
static typename FuncPtrTypes::result_type apply(typename FuncPtrTypes::input_type i) {
Or, if you prefer, you can simply bring both names in with a using-declaration:
using typename FuncPtrTypes::input_type;
using typename FuncPtrTypes::result_type;
static result_type apply(input_type i) {
No comments:
Post a Comment