У меня есть следующий минимальный код:
#include <boost/type_traits.hpp>
template<typename ptr_t>
struct TData
{
typedef typename boost::remove_extent<ptr_t>::type value_type;
ptr_t data;
value_type & operator [] ( size_t id ) { return data[id]; }
operator ptr_t & () { return data; }
};
int main( int argc, char ** argv )
{
TData<float[100][100]> t;
t[1][1] = 5;
return 0;
}
GNU С++ дает мне ошибку:
test.cpp: In function 'int main(int, char**)':
test.cpp:16: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for second:
test.cpp:9: note: candidate 1: typename boost::remove_extent<ptr_t>::type& TData<ptr_t>::operator[](size_t) [with ptr_t = float [100][100]]
test.cpp:16: note: candidate 2: operator[](float (*)[100], int) <built-in>
Мои вопросы:
- Почему GNU С++ дает ошибку, но компилятор Intel С++ не является?
- Почему изменение
operator[]
на следующие приводит к компиляции без ошибок?value_type & operator [] ( int id ) { return data[id]; }
Приветствуются ссылки на стандарт С++.
Как я вижу здесь два пути преобразования:
- (1)
int
доsize_t
и (2)operator[](size_t)
. - (1)
operator ptr_t&()
, (2)int
доsize_t
и (3) встроенныйoperator[](size_t)
.