一見、すべてが正しいように見えますが、このコードはコンパイルされません。ただし、基本クラスの戻り型をに変更する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:エラー:'virtual const double * DblPtrDft :: operator()()const'に指定された競合するリターンタイプ'DefaultValueFunctorBase.h:04:エラー:オーバーライド' const T DefaultValueFunctorBase :: operator()()const [ T = double*]'</p>の場合