shared_ptr<Shape> circle(new Circle(Vec2f(0, 0), 0.1, Vec3f(1, 0, 0)));
shared_ptr<Shape> rect(new Rect2f(Vec2f(0, 0), 5.0f, 5.0f, 0,
Vec3f(1.0f, 1.0f, 0)) );
I'm tratando de entender por qué el anterior won't compilar. Por la razón que sea, cuando intento crear una instancia de Rect2f (que SÍ hereda de la clase Shape
especificado el argumento de plantilla shared_ptr
, al igual que Circle
), obtengo los siguientes errores:
error: expected type-specifier before 'Rect2f'
error: expected ')' before 'Rect2f'
Todo lo relacionado con Circle
shared_ptr
está perfectamente bien. No hay problemas con él, es sólo el Rect2f
que está causando problemas.
Además, los valores pasados al constructor son válidos.
Entonces, ¿cuál podría ser el problema? He incluido Rect.h
para esto. En aras de la brevedad (y por si se me ha pasado algo en ese fichero que pueda estar afectando a esto), pondré lo siguiente:
Rect.h
#pragma once
#include <QGLWidget>
#include <GL/glext.h>
#include <cmath>
#include <QDebug>
#include "Shape.h"
#include "Vec3f.h"
#include "rand.h"
const int DEFAULT_SQUARE_WIDTH = 5;
const int DEFAULT_SQUARE_HEIGHT = 5;
typedef enum {
RC_TOPLEFT,
RC_TOPRIGHT,
RC_BOTTOMRIGHT,
RC_BOTTOMLEFT
} RectangleCorner;
class Rect2f : public Shape
{
public:
Rect2f(
Vec2f center = Vec2f(),
float width = 4,
float height = 4,
float radius = 0,
Vec3f color = Vec3f()
);
~Rect2f();
inline const float GetWidth( void ) const {
return mWidth;
}
inline const float GetHeight( void ) const {
return mHeight;
}
inline const Vec2f* GetCorner( RectangleCorner rc ) const {
switch( rc ) {
case RC_TOPLEFT:
return mTopLeftCrnr;
break;
case RC_TOPRIGHT:
return mTopRightCrnr;
break;
case RC_BOTTOMLEFT:
return mBottomLeftCrnr;
break;
case RC_BOTTOMRIGHT:
return mBottomRightCrnr;
break;
}
}
void UpdateCorners();
virtual void Collide( Shape &s );
virtual void Collide( Rect2f &r );
virtual void Collide ( Circle &c );
virtual bool Intersects( const Shape& s ) const;
virtual bool Intersects( const Rect2f& s ) const;
virtual bool IsAlive( void ) const;
virtual float Mass( void ) const;
protected:
virtual void Draw( void ) const;
float mWidth, mHeight;
Vec3f mColor;
private:
Vec2f* mTopLeftCrnr;
Vec2f* mTopRightCrnr;
Vec2f* mBottomLeftCrnr;
Vec2f* mBottomRightCrnr;
};
Función Fuente de Error y Cabecera de Archivo (mainwindow.cpp)
#include "ui_mainwindow.h"
#include "Vec2f.h"
#include "Rect2f.h"
#include "SharedPtr.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi( this );
BoxOfShapes* display = new InteractiveBoxOfShapes( this, 600, 600 );
ui->mGridLayout->addWidget( display );
ui->mStatusBar->showMessage( "status ok" );
QObject::connect( display, SIGNAL( numShapesChanged( int ) ), this, SLOT( setNumShapes(int) ) );
QObject::connect( ui->mResetButton, SIGNAL( pressed() ), display, SLOT( resetWorld() ) );
shared_ptr<Shape> circle(
new Circle(
Vec2f( 0, 0 ),
0.1,
Vec3f( 1, 0, 0 ) ) );
/*std::shared_ptr<Shape> rect( <---error
new Rect2f(
Vec2f( 0, 0 ),
5.0f,
5.0f,
0,
Vec3f( 1.0f, 1.0f, 0 )
)
);*/
shared_ptr< Shape > rect( new Rect2f() ); //error - second attempt
display->addShape( circle );
display->addShape( rect );
}
Prueba de Función Principal (main.cpp)
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "Rect2f.h"
int main(int argc, char *argv[])
{
Rect2f rec;
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Pregunta
A juzgar por los errores proporcionados, ¿qué me estoy perdiendo aquí? Además, ¿qué se puede hacer para rectificar este problema?
Para futuras personas luchando con un problema similar, la situación es que el compilador simplemente no puede encontrar el tipo que está utilizando (incluso si su Intelisense puede encontrarlo).
Esto puede ser causado de muchas maneras:
#include
la cabecera que lo define.#ifndef BLAH_H
) son defectuosas (tu #ifndef BLAH_H
no coincide con tu #define BALH_H
debido a un error tipográfico o de copia+pega).new Vector()
debería ser new Vector<int>()
)NamespaceA::NamespaceB
, Y un <global scope>::NamespaceB
, si ya estás dentro de NamespaceA
, buscará en NamespaceA::NamespaceB
y no se molestará en comprobar <global scope>::NamespaceB
) a menos que accedas explícitamente a él.Para acceder explícitamente a algo en el espacio de nombres global, ponle el prefijo ::
, como si el espacio de nombres global fuera un espacio de nombres sin nombre (por ejemplo, ::MiTipo
o ::MiEspacioDeNombres::MiTipo
).
En primer lugar, intentemos simplificar un poco su código:
// No need to create a circle unless it is clearly necessary to
// demonstrate the problem
// Your Rect2f defines a default constructor, so let's use it for simplicity.
shared_ptr<Shape> rect(new Rect2f());
Bien, ahora vemos que los paréntesis están claramente equilibrados. ¿Qué otra cosa podría ser? Comprobemos el siguiente fragmento de código's error:
int main() {
delete new T();
}
Esto puede parecer un uso raro, y lo es, pero realmente odio las fugas de memoria. Sin embargo, la salida parece útil:
In function 'int main()':
Line 2: error: expected type-specifier before 'T'
Ahora sólo nos queda el error de los paréntesis. No puedo encontrar la causa; sin embargo, creo que te estás olvidando de incluir el archivo que define Rect2f
.