2015-06-19 10 views
-1

У меня есть класс массива шаблонов, перегружающий как operator [] для доступа к элементам, так и operator T *, чтобы получить прямой доступ к буферам.Ошибка компиляции C++, неоднозначные перегрузки операторов

template< typename T > class buffer 
{ 
    const T & operator [] (size_t) const; 
      T & operator [] (size_t); 

    operator const T *() const; 
    operator  T *(); 
}; 

По какой-то причине, используя operator [] на экземпляр этого класса порождает ошибки компиляции о том, что существует 4 возможных перегрузках.

buffer<int> buf; 
buf[ some_position ] = 0; // Generates an error 

Ошибка:

Error 3 error C2666: 'XXX::buffer<T>::operator []' : 4 overloads have similar conversions c:\XXX.cpp 3886 

ли operator [] пытается преобразовать мой экземпляр buf в T *? Почему обнаружено 4 перегрузки вместо 2? Спасибо. :)

EDIT: На самом деле это: buf[ some_position ] = 0; // Generates an error

+1

Вы можете написать точное сообщение об ошибке? – Petr

+0

@Petr Я добавил. – Virus721

+1

Пожалуйста, разместите сообщение об ошибке _full_, включая все перегруженные списки и любые другие связанные заметки, сгенерированные компилятором. – Petr

ответ

1

Проблема в том, что у вас есть неявные преобразования, идущие в обоих направлениях.

Игнорирование const, ваши два кандидата являются:

T & buffer::operator [] (size_t); 
int& operator[] (int*, int); 

Для вызова buf[pos] где pos является int (например, буквальное), вызов неоднозначен. Первый кандидат может быть выбран путем преобразования pos в std::size_t, а второй может быть выбран путем преобразования buf в int*.

Вы можете устранить этот вызов, явно передав аргумент std::size_t или изменить оператор вместо int.

+0

Спасибо, я не знал о 'int & operator [] (int *, int);' Я предполагаю, что это оператор, не являющийся членом, который использует объект 'operator T *'? – Virus721

+0

Это просто встроенная операция для индексации целочисленного указателя как массива. Компилятор проверяет, что из-за вашего оператора неявного преобразования в 'T *'. – TartanLlama

+0

Я предполагаю, что я должен избегать связывания этих двух перегрузок и использовать именованный метод для доступа к буферу, не так ли? Подобно std :: vector – Virus721

1

Проблема у Вас есть что operator T* и operator[] и позволит buf[some_position] быть действительным. В вашем коде T* есть int* и int* имеет перегруженность [].

Вы можете видеть, что с этим live example

Я думаю, что это может быть проблема с вами VS, как работает код на Coliru и ideone с некоторыми изменениями, чтобы заставить его работать как дают рабочий код.

+0

Btw, g ++ перечисляет только 2 кандидата, а компилятор OP (VS2005) говорит четыре. Это просто, что ОП устарел Visual Studio? – Petr

+0

Да, я собираюсь кодировать проблему VS. [Coliru] (http://coliru.stacked-crooked.com/a/c938150606e84349) не против. – NathanOliver

+0

Это только часть проблемы, так как должны быть неоднозначные неявные преобразования для того, чтобы вызов был неоднозначным. – TartanLlama

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