Ответ 1
Это объясняется в книге "С++ Templates - The Complete Guide". Это потому, что ваш оператор [] принимает size_t, но вы передаете другой тип, который сначала должен пройти неявное преобразование в size_t. С другой стороны, оператор преобразования также может быть выбран, а возвращаемый указатель может быть индексом. Таким образом, существует двусмысленность. Решение - отказаться от оператора преобразования. Как правило, их следует избегать, поскольку они просто вводят проблемы, как вы видите.
Предоставить функцию-член begin
и end
, которая возвращает vector
и vector + 4
соответственно. Затем вы можете использовать v.begin()
, если хотите перейти к встроенным функциям openGL.
В комментариях есть немного путаницы. Я думаю, что сейчас я обновлю этот ответ, чтобы отразить самую последнюю концепцию этого.
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];
}