Контейнер шаблонного класса с проблемой автоматического преобразования - PullRequest
4 голосов
/ 21 января 2011

У меня есть следующий код:

#include <vector>

template<int Wt = 0>
class fixed {
public:
 explicit fixed(double val = 0) {
  operator=(val);
 }

 ~fixed(){}

 operator double() const {
  return v_;
 }

 double operator =(const double &d){
  if (d>Wt)
   v_ = Wt;
  else
   v_ = d;
  return v_;
 }

private:
 double v_;
};

int main(){
 fixed<5> x;
   std::vector<fixed<6> > v(5);
 //std::vector<fixed<6> > v(5,0);
 //fixed<6> y;
 //v[0] = 0;
 x = x*v[0];
}

Компиляция в VS 2005 Express и 2010 Express выдает следующую ошибку:

ошибка C2676: двоичный файл '*': 'исправлен' не определяет этот оператор или преобразование в тип, приемлемый для предопределенный оператор

Если я раскомментирую любую из трех строк в главной (комментируя дополнительный вектор), она скомпилируется. Если я использую gcc, он скомпилируется. Кто-нибудь может дать подсказку, почему это так?

Код является упрощенной версией более крупного проекта, поэтому, к сожалению, эти три решения для меня не подходят.

1 Ответ

1 голос
/ 21 января 2011

Это похоже на глюк в vc ++. Если я добавлю строку

x = x* (*&v[0]); 
ДО строки
x = x*v[0];
(которая вызвала ошибку), то ошибка исчезнет (я использую vc 2010 express). GCC компилирует этот код без ошибок, но только после переименования класса, исправленного на что-то другое (в противном случае он жалуется на неоднозначность этого имени, я точно не знаю, почему, возможно, он также появляется в некоторых заголовках gcc)
...