Я работал над созданием файлов классов Shape для своего класса, и примерно до 15 дополнительных строк кода все шло хорошо. Я получаю один из стандартных «Ожидаемый спецификатор типа» при создании объекта «Прямоугольник». Создание объектов двух других классов (треугольник и круг) работает отлично. Я заметил, что он вышел из строя, как только я добавил второй вектор (shapeTest2), так что, может быть, это как-то связано с этим?
В частности, речь идет о следующих строках:
shapes.push_back(new Rectangle(1, 2, 3, 4, Blue));
shapesTest2.push_back(new Rectangle(11, 22, 33, 44, Black));
Список ошибок говорит:
IntelliSense: expected a type specifier 29
IntelliSense: expected a type specifier 30
Error 1 error C2661: 'std::vector<_Ty>::push_back' : no overloaded function takes 5 arguments 31
Error 2 error C2143: syntax error : missing ';' before ')' 31
Error 3 error C2061: syntax error : identifier 'Rectangle' 31
В любом случае, вот код в файле main.cpp .:
// main.cpp - Shape class test program
// Written by _______
#include <vector>
#include <Windows.h>
#include "Circle.h"#include "Triangle.h"#include "Rectangle.h"
using namespace std;
void main()
{
// Container of Shapes
vector<Shape*> shapes;
vector<Shape*> shapesTest2; // Used for second test case of Move and Scale.
// Must allocate my object on heap now
Circle *myCircle = new Circle(10, 10, 100, Red);
shapes.push_back(myCircle);
// Create new, unnamed stack-allocated instance of a Circles and push_back() to vector
shapesTest2.push_back(new Circle(20, 20, 20, Red));
// Populate the Container with 2 Rectangles
shapes.push_back(new Rectangle(1, 2, 3, 4, Blue));
shapesTest2.push_back(new Rectangle(11, 22, 33, 44, Black));
// Populate the Container with 2 Triangles
shapes.push_back(new Triangle(3, 4, 5, 7, 15, 4, Black));
shapesTest2.push_back(new Triangle(6, 7, 9, 8, 43, 15, Green));
// There's more to the file, but this is the only time this pops up, and the rest is
// just messing around with the vector<Shape*>. I figured I'd try and save time and
// space by only posting what's needed, but if you think that the error is caused by
// code below, ask me and I'll upload the rest of this main.cpp file
}
И для справки, вот мой файл Rectangle.h:
#pragma once
#include <string>
#include "Shape.h"
using namespace std;
// Enum Colors = {Red, Blue, Green, Black, White}; is located in "Shapes.h"
class Rectangle : public Shape
{
public:
Rectangle(int x, int y, int width, int height, Colors color) : Shape(x, y, color)
{
Width = width;
Height = height;
}
virtual void Scale(float scaleFactor)
{
Width = int(Width*scaleFactor);
Height = int(Height*scaleFactor);
}
virtual void Draw() const // const b/c it doesn't alter Radius, X, Y, nor Color
{
cout << "Rectangle of width " << Width << " and height " << Height << " with the top left corner at (" << X << ", " << Y << ") and color " << GetColor() << ".\n" << endl;
}
private:
int Width;
int Height;
};
Спасибо всем за помощь, ребята, я пытался прочитать все остальные вопросы, и похоже, что люди просто забыли «#include»_«‘ Часть этого.
Причиной ошибки является своего рода конфликт имен, вызванный включением windows.h
, Удалить строку
#include <Windows.h>
и все компилируется.
Редактировать:
Чтобы избежать такого конфликта, вы можете поместить свои классы в пространство имен. В шапке напишите что-то вроде:
пространство имен Foo {
class Rectangle {…};
}
Других решений пока нет …