我对C++还是个新手。我已经广泛地搜索过了,但我还是不能让它工作。
我定义了一个名为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社区2019(v142)正在投诉:
"vec_t *"类型的参数与"const float *"类型的参数不兼容
现在,将其转换为const float *
即可完成:
Create((const float *)b);
但是,我的目标是有一个隐式转换操作符来隐式地将我的类型转换为const float *
,但是不管我怎么努力,我似乎都做不对。
所有的operator
注解都是我的尝试,它们都有有效的语法,但它们并没有解决问题。
我不明白什么?
我希望能够从FloatType
类本身内部处理这个问题,据我所知,隐式强制转换操作符是实现此目的的方法。
不要引导我另辟蹊径,这纯粹是为了练习和锻炼。
2条答案
按热度按时间1yjd4xko1#
问题在于,虽然
vec_t
是可以定义转换运算符的类类型,但vec_t *
是基元类型(指针),没有用户定义的转换应用于它。一些可能的解决方案:
vec_t
的指针,而是通过值来传递它们。如果必要的话,使用std::move
来避免潜在的昂贵的复制。这可以归结为Create(a)
。john的回答更详细地解释了这一点。Create(*b)
),以允许编译器查找用户定义的转换。vec_t
添加一个float * data()
成员函数,就像std::vector
一样,然后调用该函数来获取底层数据:Create(b->data())
std::array<float, N>
,对于动态大小的向量使用std::vector<float>
。**这可能是最好的解决方案。**要获得指向原始数据的指针,请使用vec.data()
。(同样,利用这些类型的值语义来获得内存安全。移动/复制它们,不要使用原始指针。)Create(b->operator float *())
.a8jjtwal2#
您的
vec_t
类型不是指针,因此在调用Create()
时不应使用指针作为参数:由于某种原因,您引入了指针
b
,这是您的代码无法工作的主要原因。另外,正如我在上面指出的,您的转换操作符上应该有一个额外的
const
。