1

Visual Studio 2008 でこのエラーが発生します: エラー 1 エラー C2664: 'BaseUtil::Type::CDouble::CDouble(const BaseUtil::Type::CDouble &)' : cannot convert parameter 1 from 'boost::icl:: no_type」を「const BaseUtil::Type::CDouble &」に

ここで私のクラスインターフェース:

class CDouble
{
public: 
  CDouble();
  CDouble(const CDouble& _obj);
  CDouble(const double& _val);

  bool operator==(const CDouble& _obj) const;
  bool operator==(const double& _obj) const; 
  bool operator!=(const CDouble& _obj) const;
  bool operator<=(const CDouble& _obj) const;
  bool operator>=(const CDouble& _obj) const;
  bool operator< (const CDouble& _obj) const;
  bool operator> (const CDouble& _obj) const;

  CDouble& operator= (const CDouble& _obj);
  CDouble& operator+=(const CDouble& _obj);
  CDouble& operator-=(const CDouble& _obj);

  const CDouble operator+(const CDouble& _obj) const;
  const CDouble operator-(const CDouble& _obj) const;

  const double operator/(const CDouble& _obj) const;

  CDouble& operator= (double _value);
  CDouble& operator+=(double _value);
  CDouble& operator-=(double _value);
  CDouble& operator*=(double _value);
  CDouble& operator/=(double _value);

  const CDouble operator+(double _value) const;
  const CDouble operator-(double _value) const;
  const CDouble operator*(double _value) const;
  const CDouble operator/(double _value) const;

  operator double() const {return m_value;} 

private:
  CDouble& operator*=(const CDouble&  _obj);
  const CDouble operator*(const CDouble&  _obj) const;
  CDouble& operator/=(const CDouble&  _obj);

  double m_value;
};

コンパイル エラーをトリガーするコード:

  template <class BoundType>
  class Interval
  {
  public:
    BoundType Length() const
    {
      return boost::icl::length(
        boost::icl::construct<boost::icl::interval<BoundType>::type>(m_LowerBound,    m_UpperBound, m_IntervalType())
       );
    }

  private:
    BoundType m_LowerBound, m_UpperBound; 
    typedef boost::icl::interval_bounds (*IntervalType)(); 
    IntervalType m_IntervalType;
  }

  int main()
  {
    Interval<CDouble> typeDouble(-1.0, 1.0);
    typeDouble.Length(); //<-- COMPILE ERROR
  }

エラーの意味が分からず、解決方法がわかりません。

基本型(int、double、..)でうまく機能します

誰でも助けることができますか?

4

2 に答える 2

1

回答ありがとうございますが、代わりにこれを使用しました:

namespace std
{
  template <> 
  class numeric_limits<BaseUtil::Type::CDouble> : public numeric_limits<double>
  {
  };
}  
于 2013-01-08T13:59:57.943 に答える
1

これは、boost 1.52 ヘッダー ファイルの長さ関数です。

template<class Type>
inline typename boost::enable_if<is_continuous_interval<Type>, 
  typename difference_type_of<interval_traits<Type> >::type>::type
length(const Type& object)
{
    typedef typename difference_type_of<interval_traits<Type> >::type DiffT;
    return icl::is_empty(object) ? identity_element<DiffT>::value()
                                 : upper(object) - lower(object);
}

ファイルにあります: boost\icl\type_traits\difference_type_of.hpp

template <class Type>
struct get_difference_type<Type, false, false>
{
    typedef no_type type;
};

したがって、差数値演算子をサポートする型のブースト ヘッダー ファイルのデフォルトの実装は no_type であると想定しています

やらなければならないことは、コンパイル時に、コンストラクターの 1 つに一致する相違型の定義を提供することです。つまり、たとえばコンストラクターのコピーがあなたのケースです。

あなたのタイプは数値のワッパーのように見えますが、おそらくブーストヘッダーファイルはそれを取得しません。ヘッダー ファイルの 1 つで、独自の名前空間からこのスニペットをテストしてください。

#include <boost_1_52_0\boost\icl\type_traits\is_numeric.hpp>

namespace boost{ namespace icl
{
    template <> 
    struct is_numeric<CDouble>
    {
        typedef is_numeric type;
        BOOST_STATIC_CONSTANT(bool, value = true );
    };
} }

そのままでは機能しない場合は、コピー コンストラクターが機能するように、型に差分型 (CDouble) があることをブーストするように指示するのがコツです。

于 2013-01-07T17:49:14.483 に答える