【问题标题】:C++ error: conflicting return type specified for... templated sub-classC++ 错误:为...指定的返回类型冲突...模板化子类
【发布时间】:2013-02-03 14:12:33
【问题描述】:

乍一看,一切似乎都是正确的,但这段代码不会编译。但是,如果我将基类的返回类型更改为double *,那么它将编译。有人可以解释编译器如何/为什么不将模板类型“T”视为有效的返回类型。

基类:

01 template <typename T>
02 class DefaultValueFunctorBase {
03   public:
04     virtual const T operator() (void) const = 0;
05 };

子类:

01 class DblPtrDft : public DefaultValueFunctorBase<double *> {
02   public:
03     DblPtrDft (double default_value_)
04     : DefaultValueFunctorBase<double *>(),
05       _default_value(default_value_),
06       _default_value_ptr(&_default_value)
07     {}
08 
09     const double * operator() (void) const { return _default_value_ptr; }
10 
11   private:
12     const double *_default_value_ptr;
13     const double _default_value;
14 };

错误:

DblPtrDft.h:09:错误:为“虚拟”指定的返回类型冲突 const double* DblPtrDft::operator()() const' DefaultValueFunctorBase.h:04:错误:覆盖'const T DefaultValueFunctorBase::operator()() const [with T = double*]'

【问题讨论】:

  • double* const 与 double const* 不同
  • @AndyProwl 你能回答一下并演示正确的代码应该是什么样子吗?
  • 会的,请稍等。

标签: c++ templates


【解决方案1】:

问题是const T 应该读作T const,这清楚地表明const 限定符适用于T。因此,当您在模板实例化中将T 替换为double* 时,您得到的基类调用运算符的返回类型是double* const

这与派生类的调用运算符中的返回类型不同(即const double*,相当于double const*)。在超类中,您返回一个指向double 的常量指针。在子类中,您返回一个指向常量 double 的非常量指针。

修复应用程序的一种方法是:

template<typename T>
class DefaultValueFunctorBase
{
    public:
        // Do not return T const here: the top-level const is useless anyway
        virtual T operator() (void) const = 0;
};

// Instantiate your base class template with double const* rather than double*
class DblPtrDft : public DefaultValueFunctorBase<double const*>
{
public:
    DblPtrDft (double default_value_)
    : DefaultValueFunctorBase<double const*>(), // Same change here of course...
    _default_value(default_value_),
    _default_value_ptr(&_default_value)
    {}

    // Return a double const*, consistently with the instantiated template...
    double const* operator() (void) const { return _default_value_ptr; }

private:
    double const*_default_value_ptr;
    double const _default_value;
};

【讨论】:

    【解决方案2】:

    您被覆盖的函数返回const double *,但带有T = double * 的虚函数实际上的返回类型为double * const

    【讨论】:

    • 你能演示一下正确的代码应该是什么样子吗?
    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 2020-07-27
    • 2019-06-09
    • 1970-01-01
    • 2014-03-10
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多