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
のようにCircle
クラスが指定したshared_ptr
テンプレート引数を継承する)を作成しようとすると、次のようになりますエラー:
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();
}
質問
提供されたエラーから判断すると、ここで何が欠けていますか?また、この問題を修正するために何ができますか?
同様の問題に苦しんでいる将来の人々のために、状況は、コンパイラーが使用している型を単に見つけることができないということです(Intelisenseがそれを見つけることができたとしても)。
これは多くの方法で引き起こされます:
#include
するのを忘れました。#ifndef BLAH_H
)に欠陥があります(タイプミスまたはコピー+貼り付けの間違いにより、#ifndef BLAH_H
は#define BALH_H
と一致しません)。NamespaceA::NamespaceB
があり、<global scope>::NamespaceB
がある場合、既にNamespaceA
内にいる場合は、 '明示的にアクセスしない限り、NamespaceA::NamespaceB
を確認し、<global scope>::NamespaceB
を確認する必要はありません。グローバルネームスペース内の何かに明示的にアクセスするには、グローバルネームスペースが名前のないネームスペース(例:::
または::MyType
)であるかのように、::MyNamespace::MyType
をプレフィックスとして付けます。
まず、コードをもう少しシンプルにしよう。
// 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
を定義するファイルを含めるのを忘れていると思います。
最初の回答の議論から: http://chat.stackoverflow.com/rooms/6681/discussion-between-holland-and-anton-golov
アントン:「次の仮想関数が「Rect2f」内で純粋であるため、抽象型「Rect2f」のオブジェクトを割り当てることができません。仮想ブールShape :: Intersects(const> Circle&)const」。
_Rect2f
_クラスからこの関数が欠落しているようです:
virtual bool Intersects( const Circle& c ) const;