抽象类/函数的编译错误
Compile error on abstract class/function
我在C++抽象类(其他类需要继承和实例化)上遇到了一个奇怪的错误(缺少";"、无法识别字符串类等)。此外,我希望派生类被强制实现抽象类方法——因此纯virtual=0。
下面是我的抽象类定义。
可绘制.h:
#ifndef __myns__managers__Drawable_h__
#define __myns__managers__Drawable_h__
#include <string>
namespace myns
{
namespace managers
{
class Drawable;
}
}
namespace myns
{
namespace managers
{
class Drawable
{
public:
virtual float getX() = 0;
virtual float getY() = 0;
virtual string getImageFilePath() = 0;
protected:
int drawableId;
};
}
}
#endif
根据我对C++的相对了解,我想一切都可以,对吧?但当我在VS2010上编译时,它会给我一堆编译错误,如下所示。
我该如何解决这个问题?提前谢谢。
VS构建输出:
1>------ Build started: Project: InteractiveMembranes_vc10, Configuration: X86 Debug Win32 ------
1> OutputManager.cpp
1>(project dir)managersdrawable.h(23): error C2146: syntax error : missing ';' before identifier 'getImageFilePath'
1>(project dir)managersdrawable.h(23): error C2433: 'interactivemembranes::managers::Drawable::string' : 'virtual' not permitted on data declarations
1>(project dir)managersdrawable.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>(project dir)managersdrawable.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>(project dir)managersdrawable.h(23): warning C4183: 'getImageFilePath': missing return type; assumed to be a member function returning 'int'
1>(project dir)managersdrawable.h(23): error C2253: 'interactivemembranes::managers::Drawable::getImageFilePath' : pure specifier or abstract override specifier only allowed on virtual function
1> Application.cpp
1>(project dir)managersdrawable.h(23): error C2146: syntax error : missing ';' before identifier 'getImageFilePath'
1>(project dir)managersdrawable.h(23): error C2433: 'interactivemembranes::managers::Drawable::string' : 'virtual' not permitted on data declarations
1>(project dir)managersdrawable.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>(project dir)managersdrawable.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>(project dir)managersdrawable.h(23): warning C4183: 'getImageFilePath': missing return type; assumed to be a member function returning 'int'
1>(project dir)managersdrawable.h(23): error C2253: 'interactivemembranes::managers::Drawable::getImageFilePath' : pure specifier or abstract override specifier only allowed on virtual function
1> Generating Code...
1> Compiling...
1> TestPersistence.cpp
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
您需要符合string
:
virtual std::string getImageFilePath() = 0;
string
在std
命名空间中,而不是在全局命名空间中。还有using namespace std;
选项,它将把名称空间导入全局名称空间,但不要这样做,尤其是在头中。我只是将其作为一种选择,但您应该始终更喜欢限定名称。
编辑:正如Als所指出的,您只能导入您需要的内容:using std::string;
。不过,我还是喜欢限定这个名字。
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?