Я пытаюсь переместить античную базу кода C ++ с gcc 3.2 на gcc 4.1, так как столкнулся с несколькими проблемами. Из всех проблем, следующее оставило меня в неведении (я думаю, я провел слишком много времени с Java, или я мог забыть основы C ++ :-P).
У меня есть шаблон класса
template < class T > class XVector < T >
{
...
template < class T > T
XVector < T >::getIncrement ()
{
...
}
template < class T > int
XVector < T >::getValue (size_t index, T& value)
{
...
//The problematic line
value = (T) (first_value + getIncrement())
* (long) (index - first_index);
....
}
}
Этот класс основан на STL std :: vector. У меня есть второй класс TypeValue и его определение, как показано ниже, который может содержать один из int, long и их беззнаковых вариантов, float, double, std :: string. Также перегружает практически все возможные операторы.
class TypeValue
{
union
{
long* _int_value;
double* _real_value;
string* _text_value;
} _value;
TypeValue();
explicit TypeValue(long _long);
explicit TypeValue(int _int);
explicit TypeValue(unsigned long _ulong);
...
//similarly for all the remaining supported types.
TypeValue(const TypeValue& ) //Copy constructor
virtual TypeValue& operator=(const TypeValue &rhs);
TypeValue& operator+ (TypeValue& )const;
TypeValue& operator* (TypeValue& )const;
...
//For all the basic operators
operator long() const;
operator int() const;
operator unsigned long() const;
operator unsigned int() const;
...
}
И, наконец, у меня есть другой класс, назовем его build_breaker, который создает объект как XVector < TypeValue > a_variable;
. Теперь, когда я компилирую это на gcc 3.2, это компилируется без проблем. Но когда я пытаюсь скомпилировать это на gcc 4.1, я получаю ошибки, говорящие о неоднозначной перегрузке для operator*
в классе XVector
, а кандидатами являются
operator*(long int, long int)
operator*(int, long int)
operator*(long unsigned int, long int)
operator*(unsigned int, long int)
operator*(double, long int)
operator*(float, long int)
Если бы компилятор сказал, что у него есть проблемы с поиском соответствия для T * long, это имело бы смысл, но почему он пытается типизировать его к нативному типу, а затем выполнить арифметическую операцию?
Пожалуйста, помогите мне в этом.
Заранее спасибо.