【发布时间】:2023-02-07 04:47:26
【问题描述】:
我是 C++ 的新手。我进行了广泛的搜索,但我无法让它发挥作用,甚至上帝也没有……我的意思是,ChatGPT 设法帮助了我。
我定义了一个名为“vec_t”的自定义类型。
class FloatType {
private:
float value;
public:
FloatType() : value(0.0f) {}
FloatType(float v) : value(v) {}
//operator float() { return value; }
//operator float() { return value; }
//explicit operator const float* () { return &value; }
//operator float* () const { return &value; }
//operator const float* () { return &value; }
//operator const float() { return (const float)value; }
//operator const float*() { return &value; }
}
typedef FloatType vec_t;
我还创建了一个将 const float * 作为唯一参数的函数。
void Create(const float* vColor = NULL);
void Create(const float* vColor) {
//...
}
现在,当像这样调用函数时......
vec_t a = { 2.5f };
vec_t* b = &a;
Create(b);
...Visual Studio Community 2019 (v142) 正在抱怨argument of type "vec_t *" is incompatible with parameter of type "const float *"。
现在,当场将其转换为“const float *”即可完成:
Create((const float *)b);
但是,我的目标是有一个隐式转换运算符来从我的类型隐式转换为“const float *”,但是,无论我如何努力,我似乎都无法做到。
所有operator cmets 都是我的尝试,它们都有有效的语法,但它们并没有使问题消失。
我不明白什么?
我希望能够从 FloatType 类本身内部处理这个问题,据我所知,隐式转换运算符是这样做的方法。不要指导我使用其他方法,这纯粹是为了练习和锻炼。
提前致谢。
【问题讨论】:
-
传递
a而不是b,您的操作员就会工作。 -
“现在,当场将其转换为“const float *”即可完成:“:不,这会导致未定义的行为。它只是看起来有效。不要在 C++ 中使用像这样的 C 样式转换。你最终会像你在这里做的那样导致未定义的行为。
-
实际上,在这种非常特殊的情况下,您的演员表是有效的。 (您的班级恰好是标准布局。)然而,我所说的确实适用于一般情况。