c++ 类型 * 的参数与类型“const float *”的参数不兼容

fxnxkyjh  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(410)

我对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类本身内部处理这个问题,据我所知,隐式强制转换操作符是实现此目的的方法。
不要引导我另辟蹊径,这纯粹是为了练习和锻炼。

1yjd4xko

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 *()).
a8jjtwal

a8jjtwal2#

您的vec_t类型不是指针,因此在调用Create()时不应使用指针作为参数:

class FloatType 
{
private:
    float value;
public:
    ...
    operator const float* () const { return &value; }
               // const here ^^^^^
};

typedef FloatType vec_t;

vec_t a = { 2.5f };
Create(a);

由于某种原因,您引入了指针b,这是您的代码无法工作的主要原因。
另外,正如我在上面指出的,您的转换操作符上应该有一个额外的const

相关问题