gpt4 book ai didi

C++ 运算符歧义

转载 作者:太空狗 更新时间:2023-10-29 20:19:33 26 4
gpt4 key购买 nike

请原谅我,因为我是 C++ 的新手,但我在运算符歧义方面遇到了一些麻烦。对于在我的桌面上编译的代码,我认为它是特定于编译器的。但是,它无法在我的笔记本电脑上编译。我想我知道出了什么问题,但我看不到解决它的优雅方法。如果我犯了一个明显的错误,请告诉我。无论如何,这就是我想要做的:

我创建了自己的 vector 类 Vector4,它看起来像这样:

class Vector4
{
private:
GLfloat vector[4];
...
}

然后我有这些操作符,它们导致了问题:

operator GLfloat* () { return vector; }

operator const GLfloat* () const { return vector; }

GLfloat& operator [] (const size_t i) { return vector[i]; }

const GLfloat& operator [] (const size_t i) const { return vector[i]; }

我有转换运算符,这样我就可以将我的 Vector4 类的实例传递给 glVertex3fv,并且出于显而易见的原因我有下标。但是,涉及下标 Vector4 的调用对编译器来说变得不明确:

enum {x, y, z, w}
Vector4 v(1.0, 2.0, 3.0, 4.0);

glTranslatef(v[x], v[y], v[z]);

候选人如下:

candidate 1: const GLfloat& Vector4:: operator[](size_t) const
candidate 2: operator[](const GLfloat*, int) <built-in>

当下标运算符已经在 Vector4 上定义时,为什么它会首先尝试将我的 Vector4 转换为 GLfloat*?有没有一种不涉及类型转换的简单方法?我只是犯了一个愚蠢的错误吗?提前感谢您的帮助。

最佳答案

这在《C++ 模板 - 完整指南》一书中有解释。这是因为您的 operator[] 采用 size_t,但您传递了一个不同的类型,该类型首先必须进行到 size_t 的隐式转换。另一方面,也可以选择转换运算符,然后返回的指针可以是下标。所以有歧义。解决方案是删除转换运算符。如您所见,通常应避免使用它们,因为它们只会带来问题。

提供一个 beginend 成员函数,分别返回 vectorvector + 4。如果您想传递给 native openGL 函数,则可以使用 v.begin()

评论有点困惑。我想我现在会更新这个答案以反射(reflect)这方面的最新概念。

struct Vector4 {
// some of container requirements
typedef GLfloat value_type;
typedef GLfloat& reference;
typedef GLfloat const& const_reference;

typedef GLfloat * iterator;
typedef GLfloat const * const_iterator;

typedef std::ptrdiff_t difference_type;
typedef std::size_t size_type;

static const size_type static_size = 4;

// returns iterators to the begin and end
iterator begin() { return vector; }
iterator end() { return vector + size(); }

const_iterator begin() const { return vector; }
const_iterator end() const { return vector + size(); }

size_type size() const { return static_size; }
size_type max_size() const { return static_size; }

void swap(Vector4 & that) {
std::swap(*this, that);
}

// some of sequences
reference operator[](size_type t) { return vector[t]; }
const_reference operator[](size_type t) const { return vector[t]; }

// specific for us. returns a pointer to the begin of our buffer.
// compatible with std::vector, std::array and std::string of c++1x
value_type * data() { return vector; }
value_type const* data() const { return vector; }

// comparison stuff for containers
friend bool operator==(Vector4 const&a, Vector4 const&b) {
return std::equal(a.begin(), a.end(), b.begin());
}
friend bool operator!=(Vector4 const&a, Vector4 const&b) { return !(a == b); }
friend bool operator<(Vector4 const&a, Vector4 const&b) {
return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
}
friend bool operator> (Vector4 const&a, Vector4 const&b) { return b < a; }
friend bool operator<=(Vector4 const&a, Vector4 const&b) { return !(b < a); }
friend bool operator>=(Vector4 const&a, Vector4 const&b) { return !(a < b); }

private:
GLfloat vector[4];
}

关于C++ 运算符歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com