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();
}
问题
从提供的错误来看,我在这里缺少什么?还有什么可以解决这个问题?
答案 0 :(得分:159)
对于未来遇到类似问题的人来说,情况是编译器根本无法找到您正在使用的类型(即使您的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
)。
答案 1 :(得分: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());
好的,现在我们看到括号明显平衡。还有什么呢?我们来查看following code snippet's error:
int main() {
delete new T();
}
这可能看起来像是奇怪的用法,但是我确实讨厌内存泄漏。但是,输出似乎很有用:
In function 'int main()':
Line 2: error: expected type-specifier before 'T'
啊哈!现在我们只剩下关于括号的错误。我找不到导致这种情况的原因;但是,我认为您忘记包含定义Rect2f
的文件。
答案 2 :(得分:0)
从第一个答案的讨论中得出: http://chat.stackoverflow.com/rooms/6681/discussion-between-holland-and-anton-golov
安东: 它给出了错误“无法分配抽象类型的对象'Rect2f',因为&gt;以下虚函数在'Rect2f'中是纯粹的:虚拟bool Shape :: Intersects(const&gt; Circle&amp;)const”。
您的Rect2f
课程似乎缺少此功能:
virtual bool Intersects( const Circle& c ) const;