2011-01-21 3 views
4

У меня есть следующий код:Контейнер шаблонного класса с проблемой автоматического преобразования

#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 Экспресс и 2010 экспресс дает следующее сообщение об ошибке:

error C2676: binary '*' : 'fixed' does not define this operator or a conversion to a type acceptable to the predefined operator

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

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

ответ

1

Кажется, что сбой в vC++. Если я добавлю строку

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

+0

Окружающая среда Я пытался использовать Qt, который использует gcc, но думаю, что у него нет одинаковых заголовков. Я сообщил об ошибке: https://connect.microsoft.com/VisualStudio/feedback/details/637760/container-of-template-class-with-automatic-conversion-problem –

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