Оператор Subscript ("[]") выдает странные ошибки - PullRequest
0 голосов
/ 11 июня 2018

Я получаю странное поведение от Visual Studio, касающееся следующего фрагмента кода. Список ошибок показывает несколько экземпляров E0349: ни один оператор "[]" не соответствует этим операндам.

Кажется, что Intellisense подразумевает несоответствие типов, но, как вы увидите в коде, несоответствия типов нет.

Для начала я определил структуру Vec4 для целей созданияmat4: (я только включил соответствующие функции)

struct Vec4f
{
    union
    {
        struct { float x, y, z, w; };
        struct { float r, g, b, a; };
    };
    // copy constructor
    Vec4f(Vec4f const & v) :
        x(v.x),
        y(v.y),
        z(v.z),
        w(v.w)
    {

    }
    // Operators
    float & operator[](int index)
    {
        assert(index > -1 && index < 4);
        return (&x)[index];
    }

    Vec4f & operator=(Vec4f const & v)
    {
        // If I use: "this->x = v[0];" as above, E0349
        this->x = v.x;
        this->y = v.y;
        this->z = v.z;
        this->w = v.w;
        return *this;
    }    
}

Используя вышеупомянутый класс Vec4, я создал матрицу 4x4:

struct Mat4f
{
    //storage for matrix values
    Vec4f value[4];

    //copy constructor
    Mat4f(const Mat4f& m)
    {
        value[0] = m[0]; // calling m[0] causes E0349
        value[1] = m[1];
        value[2] = m[2];
        value[2] = m[3];
    }

    inline Vec4f & operator[](const int index)
    {
        assert(index > -1 && index < 4);
        return this->value[index];
    }
}

Когда любой из "[]"операторы вызваны, я в конечном итоге с этой ошибкой E0349, и я не понимаю проблему.Как ни странно, файл компилируется просто отлично.Я попытался удалить скрытый файл ".suo", как предложено в ответе на другой вопрос, но безрезультатно.Я был бы признателен, если бы мне это объяснили.

1 Ответ

0 голосов
/ 11 июня 2018

Mat4f::operator[] - неконстантная функция-член, которую нельзя вызывать для аргумента m из Mat4f::Mat4f, она объявлена ​​как const & Mat4f.

Вы можете добавить еще const перегрузка, которая может быть вызвана на константы.например,

inline Vec4f const & operator[](const int index) const
//           ~~~~~                               ~~~~~
{
    assert(-1 < index && index < 4); // As @Someprogrammerdude commented, assert(-1 < index < 4) doesn't do what you expect
    return this->value[index];
}
...