Это может быть тупым вопрос, который задает сегодня, но независимо я буду давить на:Почему «пустой блок атрибутов» не разрешен?
Следующего производного класса с перегруженным оператором +=
, базовый класс, который перегружает оператор []
выдает следующую ошибку компилятора:
блок пустой атрибут не допускается
Я обычно пишу 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;
}
Я думаю, что ваш вопрос будет лучше назван как «что такое блок атрибутов?» – Hurkyl