2015-07-14 3 views
2

Это может быть тупым вопрос, который задает сегодня, но независимо я буду давить на:Почему «пустой блок атрибутов» не разрешен?

Следующего производного класса с перегруженным оператором +=, базовый класс, который перегружает оператор [] выдает следующую ошибку компилятора:

блок пустой атрибут не допускается

Я обычно пишу v[0] и v[1] в операторе += конечно, но мне было интересно, как т o будет ли он компилироваться, а если нет, то почему бы и нет.

Что такое блок атрибутов? Почему компилятор не разрешает [0] оператору [], возвращая ссылку из базового класса? Просто вопрос синтаксиса или что-то глубже?

#include <array> 

template<class T, int C> 
struct Vec 
{ 
    typedef T value_type; 
    typedef unsigned index_type; 
    typedef unsigned size_type; 

    std::array<T, C> v; 

    template<typename ...Args> 
    explicit Vec(Args&&... args) : v({{args...}}) {} 
    Vec(std::array<T, C> const & o) : v(o) {} 

    value_type & operator [] (index_type i) 
    {   
     return v[i]; 
    } 

    value_type const & operator [] (index_type i) const 
    { 
     return v[i]; 
    } 
}; 

template<class T> 
struct Vec2 : Vec<T, 2> 
{ 
    template<typename ...Args> 
    explicit Vec2(Args... args) : Vec<T, 2>(args...) {} 
    Vec2(Vec2<T> const & p) : Vec<T, 2>(p.v) {}  

    Vec2<T> & operator += (Vec2<T> const & q) 
    { 
     [0] += q[0]; 
     [1] += q[1]; 

     return *this; 
    } 
}; 

int main(void) 
{ 
    Vec2<int> a(10, 20); 
    Vec2<int> b(30, 40); 

    a += b; 

    return 0; 
} 
+0

Я думаю, что ваш вопрос будет лучше назван как «что такое блок атрибутов?» – Hurkyl

ответ

3

Измените свой operator+= на вызов operator[], утверждение, подобное [0], не является допустимым C++.

Vec2<T> & operator += (Vec2<T> const & q) 
{ 
    operator[](0) += q[0]; 
    operator[](1) += q[1]; 

    return *this; 
} 
5

Вы не можете использовать операторы freeform таким образом. Вы должны предоставить явно this, например. (*this)[0]. Сообщение об ошибке, ссылающееся на атрибуты, просто потому, что для обозначения атрибутов также можно использовать [].

Смежные вопросы