C++;重载函数和隐式强制转换 我有一些代码工作正常,但是我想确保它在C++标准下总是正常工作。

C++;重载函数和隐式强制转换 我有一些代码工作正常,但是我想确保它在C++标准下总是正常工作。,c++,implicit-conversion,overload-resolution,C++,Implicit Conversion,Overload Resolution,我创建了两个隐式转换为double的类型,并为每个类型创建了sin()函数。我对它进行了测试,并调用了正确的sin()重载,但是否可以保证编译器不会决定将对象实例隐式转换为double并调用math.h函数 此外,如果我的类和sin()重载位于命名空间中,这有关系吗?如果我给他们中的任何一个做模板有关系吗 struct AngleDegrees; struct AngleRadians; inline double degs2Rads(double degs) { return degs *

我创建了两个隐式转换为double的类型,并为每个类型创建了sin()函数。我对它进行了测试,并调用了正确的sin()重载,但是否可以保证编译器不会决定将对象实例隐式转换为double并调用math.h函数

此外,如果我的类和sin()重载位于命名空间中,这有关系吗?如果我给他们中的任何一个做模板有关系吗

struct AngleDegrees;
struct AngleRadians;

inline double degs2Rads(double degs) { return degs * PI / 180.0; }
inline double rads2Degs(double degs) { return degs * 180.0 / PI; }

struct AngleDegrees
{
private:
    double m_val;

public:
    explicit AngleDegrees(double val) : m_val(val) { }
    explicit AngleDegrees(const AngleRadians& rads);

    operator double() const { return m_val; }
};

struct AngleRadians
{
private:
    double m_val;

public:
    explicit AngleRadians(double val) : m_val(val) { }
    explicit AngleRadians(const AngleDegrees& degs);

    operator double() const { return m_val; }
};

inline AngleDegrees::AngleDegrees(const AngleRadians& rads)
{
    m_val = rads2Degs(rads);
}

inline AngleRadians::AngleRadians(const AngleDegrees& degs)
{
    m_val = degs2Rads(degs);
}

inline double sin(const AngleDegrees& degs)
{
    std::cout << "called sin(AngleDegrees)\n";
    AngleRadians rads(degs);
    return sin((double)rads);
}

inline double sin(const AngleRadians& rads)
{
    std::cout << "called sin(AngleRadians)\n";
    return sin((double)rads);
}
struct角度度;
结构角弧度;
内联双degs2Rads(双degs){返回degs*PI/180.0;}
内联双rads2Degs(双degs){返回degs*180.0/PI;}
结构角度度
{
私人:
双m_val;
公众:
显式角度度(双val):m_val(val){}
显式角度度(常数角度弧度和弧度);
运算符double()常量{return m_val;}
};
结构角弧度
{
私人:
双m_val;
公众:
显式角度弧度(双val):m_val(val){}
显式角度弧度(常数角度度和度);
运算符double()常量{return m_val;}
};
内联角度度::角度度(常数角度弧度和弧度)
{
m_val=rads2Degs(rads);
}
内联角度弧度::角度弧度(常数角度度和角度)
{
m_val=degs2Rads(degs);
}
直列双正弦(常数角度度和角度)
{

std::cout特定的重载将比使用转换为double更好匹配(如果不需要添加
const
则更精确),因此将调用正确的版本

也就是说,将代码放在名称空间中,让ADR找到正确的函数以避免任何可能的混淆


编辑:您可以考虑使用Boost单元框架来帮助您,而不是自己编码。

< P>我将删除隐式转换,并使用成员函数代替。当然,这些类的原因是为了避免存在可以在一个或另一个单元中的变量的问题吗?

看看食人魔框架,例如:


至于函数的名称空间,请看一看ADL:您可以将类和sin函数放在同一个名称空间中。

您可以使转换函数
显式
…然后有人偶然调用
cos
,落入陷阱。虽然了解隐式转换规则很重要,但应该避免需要这些知识的符号。编译器永远不会决定强制转换任何内容。强制转换是您在源代码中编写的,用于告诉编译器将值转换为其他类型的内容。