我在Visual Studio 2008中遇到此错误: 错误1错误C2664:'BaseUtil :: Type :: CDouble :: CDouble(const BaseUtil :: Type :: CDouble&)':无法将参数1从'boost :: icl :: no_type'转换为'const BaseUtil ::输入:: 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,..)
任何人都可以提供帮助吗?
答案 0 :(得分: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;
};
所以我假设支持差异数值运算符的类型的boost头文件defaut实现是 no_type 。
必须做的是,在编译时提供与您的一个构造函数匹配的差异类型的定义。即,例如,构造函数副本就是你的情况。
虽然,你的类型看起来像数字值上的wapper,但是升级头文件可能无法得到它。请在您的一个头文件中使用专有命名空间测试此代码段。
#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 );
};
} }
如果它不能正常工作,诀窍是告诉你提升你的类型有一个diffence类型(一个CDouble),这样复制构造函数就可以了。
答案 1 :(得分:1)
感谢您的回答,但我使用了它:
namespace std
{
template <>
class numeric_limits<BaseUtil::Type::CDouble> : public numeric_limits<double>
{
};
}