2013-02-19 61 views
0

乍一看,一切看起來都是正確的,但此代碼不會編譯。但是,如果我要將基類的返回類型更改爲double *,那麼它將編譯。有人可以解釋爲什麼編譯器沒有看到模板類型「T」作爲有效的返回類型。C++錯誤:指定用於...模板化子類的衝突返回類型

基類:

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: error: conflicting return type specified for ‘virtual const double* DblPtrDft::operator()() const’ DefaultValueFunctorBase.h:04: error: overriding ‘const T DefaultValueFunctorBase::operator()() const [with T = double*]’

+3

雙* const的是不一樣的雙常量* – 2013-02-19 01:29:12

+0

@AndyProwl你可以請一個答案,並演示了正確的代碼應該是什麼樣子? – Zak 2013-02-19 01:53:16

+0

會這麼做,給我一點時間。 – 2013-02-19 01:59:16

回答

4

問題是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; 
}; 
1

你重寫的功能RET請輸入const double *,但虛擬函數T = double *實際上有一個返回類型double * const

+0

您能否請證明正確的代碼應該是什麼樣子? – Zak 2013-02-19 01:58:56