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)) );
Я'м пытаясь понять, почему выше выиграл'т компилировать. По какой-то причине, когда я пытаюсь создать экземпляр Rect2f (который наследует от класса форма указанного параметра шаблона shared_ptr
, как круг
), я получаю следующее ошибки:
error: expected type-specifier before 'Rect2f'
error: expected ')' before 'Rect2f'
Все о круг
shared_ptr-это прекрасно. Нет никаких проблем с ним; его'ы только
Rect2f`, который вызывает вопросы.
Кроме того, значения, которые передаются в конструктор действительны.
Так, что может проблема быть с этим? У меня есть прямоугольник.ч` включен для этого. Для краткости'ы имя (и в случае если я пропустил что-то в том, что файл, который может влиять на это), я'выложу следующее:
Вильный.ч
#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;
};
Источник функция ошибка и файл заголовка (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 );
}
Основная функция тест (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();
}
Вопрос
Судя из ошибки, что я здесь отсутствует? Кроме того, что можно сделать, чтобы исправить эту проблему?
Для будущих людей, борющихся с подобной проблемой, ситуация такова, что компилятор просто не можете найти тип вы используете (даже если ваш Intelisense можете найти его).
Это может быть вызвана различными способами:
включать
заголовок, который определяет его.#ifndef BLAH_H
) неисправен (код #ifndef BLAH_H
не'т соответствовать вашему #определяем BALH_H
из-за опечатки или копировать+вставить ошибку).новый вектор()
должен быть новый вектор и Л;int> У()
), и в
<глобальный масштаб>::NamespaceB, если вы уже находитесь в NamespaceA, это'будете выглядеть в NamespaceA::NamespaceB и не удосужились проверить в <глобальный масштаб>::NamespaceB
), если явно открыть его.Чтобы явно открыть что-то в глобальном пространстве имен, префикс это с ::
, как будто в глобальное пространство имен является пространством имен без имени (например,:: тип mytype
или ::Мое_пространство_имен::тип mytype
).
Прежде всего, позвольте's попытаться сделать код немного проще:
// 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());
Итак, теперь мы видим, что в скобках четко сбалансированным. Что еще может быть? Позвольте's проверьте в следующем фрагменте кода'ы об ошибке:
int main() {
delete new T();
}
Это может показаться странным использование, и это, но я действительно ненавижу утечек памяти. Однако, выход, кажется полезным:
In function 'int main()':
Line 2: error: expected type-specifier before 'T'
АХА! Теперь мы're просто оставили с ошибкой о скобках. Я могу'т найти то, что вызывает что; однако, я думаю, что вы не забыли включить файл, который определяет Rect2f
.