C运算符歧义
发布时间:2020-12-16 09:23:28 所属栏目:百科 来源:网络整理
导读:原谅我,因为我对C很新,但我在运算符歧义方面遇到了一些麻烦.对于我桌面上编译的代码,我认为它是特定于编译器的.但是,它无法在我的笔记本电脑上编译.我想我知道出了什么问题,但我看不到它的优雅方式.如果我犯了一个明显的错误,请告诉我.无论如何,这就是我要做
原谅我,因为我对C很新,但我在运算符歧义方面遇到了一些麻烦.对于我桌面上编译的代码,我认为它是特定于编译器的.但是,它无法在我的笔记本电脑上编译.我想我知道出了什么问题,但我看不到它的优雅方式.如果我犯了一个明显的错误,请告诉我.无论如何,这就是我要做的事情:
我创建了自己的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.另一方面,也可以选择转换运算符,然后返回的指针可以是下标.所以有歧义.解决方案是删除转换运算符.如你所见,一般应该避免它们,因为它们只会引入问题.
提供分别返回向量和向量4的开始和结束成员函数.然后,如果要传递给本机openGL函数,可以使用v.begin(). 评论中有点混乱.我想我现在会更新这个答案,以反映最新的概念. 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(),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]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |