覆盖虚拟函数时,为什么需要显式模板参数?

时间:2018-09-25 03:26:21

标签: c++

这是我的问题。如果我没有将模板参数明确地放在派生:: getType()函数中,则会出现以下错误。

类模板参数推论仅适用于-std = c ++ 1z或-std = gnu ++ 1z

但是即使使用-std标志,它仍然会引发错误。

class myT {
    // full implementation
};

template<class T>
class base {
public:
    virtual my_getter_type<T>* getter() = 0;
}

class derived : public base<myT> {
public:
    my_getter_type<myT>* getter();   // this is OK, no compile error
    my_getter_type* getType();       // this is NOT OK, compile error
}

2 个答案:

答案 0 :(得分:2)

您想得太多。很明显,返回类型必须是一个类型。 my_getter_type<myT>*是一种类型。 my_getter_type是模板。

my_getter_type*也没有意义,因为*必须遵循基本类型才能构成指针类型。

答案 1 :(得分:2)

基类中函数的返回类型与派生类中具有相同名称的函数的返回类型之间没有固有的联系。也就是说,这样做是完全合法的:

struct base {
    int f();
};

struct derived : base {
    double f();
};

在基础上将f()虚拟化不会改变这一点。

与问题中返回类型为getter()的事物相同;基类版本返回my_getter_type<T>,但这并不意味着派生版本也必须返回my_getter_type<T>;同样,将getter()的派生版本返回my_getter_type<T*>intvoid或其他任何东西都是完全合法的。

当然,my_getter_type是模板,而不是类型,因此不能是合法的返回类型。