2015-10-08 4 views
0
class Vehicle 
{ 
public: 
//[...] 
    virtual std::ostream& ostreamOutput(std::ostream&) const; // virtual in order to use it for subclasse like cars, busses etc. 

    virtual double Speed() const; //returns the speed of a vehicle, is implemented in derived classes 

private: 
    int Number 
    std::string Name 
//[...] 

protected: 
    int MaxSpeed; //these variables were also needed in the derived classes 
}; 

std::ostream& Vehicle::ostreamOutput(std::ostream& os) const 
{ 
    os << std::resetiosflags(std::ios::right) << std::setiosflags(std::ios::left) <<  std::setfill(' ') << "" 
     << std::setw(4) << Number 
     << std::setw(9) << Name 
     << std::setw(15) << Speed() 
     << std::setw(5) << MaxSpeed 

    return os; 
} 

std::ostream& operator<<(std::ostream& os, const Vehicle& x) 
{ 
    x.ostreamOutput(os); 
    return os; 
} 

main() //I wanted to overload the "<<"-Operator in order to print the vehicle information without //a seperate function 
{ 
    Vehicle Vehicle1("Vehicle1", 80); 

    std::cout << Vehicle1 << std::endl;//the first shift-operator contains the error 
} 

Я пытался перегружать Shiftoperator, но я получаю сообщение об ошибке с именем: «ошибка c2679 двоичного„“не оператора найден, который принимает правый операнд типа».Перегрузка оператора <<

Ошибка произошла в первом Операторе сдвига в функции main. Я хочу напечатать Vehicle и его производные классы с перегруженным оператором.

Можете ли вы объяснить мне ошибку? Я действительно не знаю, как исправить это.

ответ

1

Я установил все опечатки (пропущенные точки с запятой) в источнике, а здесь полный рабочий пример:

#include <iostream> 
#include <iomanip> 

using namespace std; 

class Vehicle 
{ 
public: 
//[...] 
    Vehicle (const char* Name, int Number) 
     : Name (Name), Number (Number) 
    {} 
    virtual std::ostream& ostreamOutput(std::ostream&) const; // virtual in order to use it for subclasse like cars, busses etc. 

    virtual double Speed() const {return 0.;} //returns the speed of a vehicle, is implemented in derived classes 

private: 
    // remove in-class initializers below if you need to avoid C++11 
    int Number = -1; 
    std::string Name = "not set"; 
//[...] 

protected: 
    int MaxSpeed = 200; //these variables were also needed in the derived classes 
}; 

std::ostream& Vehicle::ostreamOutput(std::ostream& os) const 
{ 
    os << std::resetiosflags(std::ios::right) << std::setiosflags(std::ios::left) <<  std::setfill(' ') << "" 
     << std::setw(4) << Number 
     << std::setw(9) << Name 
     << std::setw(15) << Speed() 
     << std::setw(5) << MaxSpeed; 

    return os; 
} 

std::ostream& operator<<(std::ostream& os, const Vehicle& x) 
{ 
    x.ostreamOutput(os); 
    return os; 
} 

int main() //I wanted to overload the "<<"-Operator in order to print the vehicle information without //a seperate function 
{ 
    Vehicle Vehicle1("Vehicle1", 80); 

    std::cout << Vehicle1 << std::endl;//the first shift-operator contains the error 
} 

Может быть, вы выведете некоторые другие переменные, для которых operator<< не определен. Чтобы отладить этот случай, разделите код, например. это:

os << std::resetiosflags(std::ios::right) << std::setiosflags(std::ios::left) <<  std::setfill(' ') << "" 
     << std::setw(4) << Number 
     << std::setw(9) << Name 
     << std::setw(15) << Speed() 
     << std::setw(5) << MaxSpeed; 

к этому:

os << std::resetiosflags(std::ios::right) << std::setiosflags(std::ios::left) <<  std::setfill(' ') << "" 
     << std::setw(4) << Number; 
    os << std::setw(9) << Name; 
    os << std::setw(15) << Speed(); 
    os << std::setw(5) << MaxSpeed; 

Таким образом, вы получите сообщение об ошибке для реальной линии, которая вызывает тревогу. В противном случае вы получите сообщение об ошибке только для первой строки, используемый вами компилятор, по-видимому, не отличает строки в этом случае.

+0

Спасибо за ваш ответ. Я разделил код, как и сказал, к сожалению, он не исправляет ошибку. Когда я держу указатель мыши над оператором сдвига, он показывает мне: Ошибка оператора '<<' соответствует этим операндам. Типы операндов: std :: ostream << Vehicle. – AlTrain

+0

@AlTrain, но вы на самом деле пытались его скомпилировать? Когда вы держите мышь над исходной строкой, скорее всего, работают внутренние эвристики IDE, а не настоящий компилятор. Их легко смущает C++. Я проверил этот источник с g ++ 4.8 и clang 3.4, оба довольно старые. Что касается расщепления источника, он должен просто облегчить поиск реальной строки ошибки, но она не может решить проблему никоим образом. – gluk47

+0

Я опубликовал части моей программы, которые важны для вопроса, поэтому я скомпилировал его в своей программе (со всеми инициализированными переменными производных классов и т. Д., Которые я уже тестировал, ошибки не было/ошибкой), и это все равно дает мне та же ошибка. Я использую Visual Studio 2012. Кстати, объявления const корректны? – AlTrain

0

Ваш код пример содержит только опечатки (Транспортное средство < -> Fahrzeug, ostreamAusgabe < -> ostreamOutput, точка с запятой после Speed ​​() в ostreamOutput()). Перегруженный оператор < < должен работать нормально.

Попробуйте скомпилировать и запустить этот код:

class Vehicle 
{ 
public: 
    Vehicle(const std::string& name, int num) 
     : Name(Name) 
     , Number(num) 
     , MaxSpeed(100) 
    {} 

    virtual std::ostream& ostreamOutput(std::ostream&) const; 
    virtual double Speed() const; 

private: 
    int Number; 
    std::string Name; 

protected: 
    int MaxSpeed; 
}; 

double Vehicle::Speed() const 
{ 
    return 0.0; 
} 

std::ostream& Vehicle::ostreamOutput(std::ostream& os) const 
{ 
    os << std::resetiosflags(std::ios::right) << std::setiosflags(std::ios::left) <<  std::setfill(' ') << "" 
     << std::setw(4) << Number 
     << std::setw(9) << Name 
     << std::setw(15) << Speed() 
     << std::setw(5) << MaxSpeed; 

    return os; 
} 

std::ostream& operator<<(std::ostream& os, const Vehicle& x) 
{ 
    x.ostreamOutput(os); 
    return os; 
} 

int main() 
{ 
    Vehicle Vehicle1("Vehicle1", 80); 

    std::cout << Vehicle1 << std::endl; 
    return 0; 
} 
+0

Что-то должно быть не так с типами операторов, я исправил свои ошибки выше, но ошибка все еще остается. Спасибо за ваш ответ. – AlTrain

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