Палец вверх 35
Перевод
Перевод

Ошибка: ожидаемый спецификатор типа перед «ClassName»

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 (который наследует от класса Shape заданного аргументом шаблона shared_ptr , так же, как Circle ), я получаю следующие ошибки :

error: expected type-specifier before 'Rect2f'
error: expected ')' before 'Rect2f'

Все в Circle shared_ptr прекрасно. С этим проблем нет; это только Rect2f который вызывает проблемы.

Кроме того, значения, переданные в конструктор, являются действительными.

Итак, что может быть проблема с этим? У меня есть Rect.h для этого. Для краткости (и если я что-то пропустил в этом файле, что может повлиять на это), я выложу следующее:

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;

};

Источник ошибки и заголовок файла (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();
}

Вопрос

Судя по предоставленным ошибкам, чего мне здесь не хватает? Кроме того, что можно сделать, чтобы исправить эту проблему?

c++ shared-ptr pure-virtual
задан zeboidlund 13 янв. 2012 г., 6:18:54
источник

3 ответа

Палец вверх 152
Перевод
Перевод

Для будущих людей, борющихся с подобной проблемой, ситуация такова, что компилятор просто не может найти тип, который вы используете (даже если ваш Intelisense может его найти).

Это может быть вызвано разными способами:

  • Вы забыли #include заголовок, который его определяет.
  • Ваши предохранители включения ( #ifndef BLAH_H ) неисправны (ваш #ifndef BLAH_H не соответствует вашему #define BALH_H из-за #define BALH_H или копировании + вставке).
  • Или компилятор думает, что вы имели в виду одну область, когда вы действительно имели в виду другую (например, если у вас есть NamespaceA::NamespaceB И И <global scope>::NamespaceB , если вы уже находитесь в NamespaceA , он будет выглядеть в NamespaceA::NamespaceB и не утруждайте себя проверкой <global scope>::NamespaceB ), если у вас нет явного доступа к нему.

Чтобы явно получить доступ к чему-либо в глобальном пространстве имен, добавьте к нему префикс :: , как будто глобальное пространство имен является пространством имен без имени (например, ::MyType или ::MyNamespace::MyType ).

ответ дан Jamin Grey 23 мар. 2012 г., 0:19:57
источник
Палец вверх 7
Перевод
Перевод

Прежде всего, давайте попробуем сделать ваш код немного проще:

// 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());

Хорошо, теперь мы видим, что скобки четко сбалансированы. Что еще это может быть? Давайте проверим ошибку следующего фрагмента кода :

int main() {
    delete new T();
}

Это может показаться странным использованием, и это так, но я действительно ненавижу утечки памяти. Тем не менее, вывод кажется полезным:

In function 'int main()':
Line 2: error: expected type-specifier before 'T'

Ага! Теперь у нас просто ошибка с круглыми скобками. Я не могу найти, что вызывает это; Тем не менее, я думаю, что вы забыли включить файл, который определяет Rect2f .

ответ дан Anton Golov 13 янв. 2012 г., 6:33:45
источник
Палец вверх 0
Перевод
Перевод

Из обсуждения первого ответа: http://chat.stackoverflow.com/rooms/6681/discussion-between-holland-and-anton-golov

Антон: Это дает мне ошибку "не удается выделить объект абстрактного типа 'Rect2f', потому что следующие виртуальные функции являются чистыми внутри 'Rect2f': virtual bool Shape :: Intersects (const> Circle &) const".

Похоже, вам не хватает этой функции из вашего класса Rect2f :

virtual bool Intersects( const Circle& c ) const;

ответ дан Freerobots 13 янв. 2012 г., 11:56:15
источник