错误 C2062:类型 int 意外
Posted
技术标签:
【中文标题】错误 C2062:类型 int 意外【英文标题】:error C2062 : type int unexpected 【发布时间】:2012-11-14 18:25:45 【问题描述】:我是 C++ 和 SWIG 的新手
我正在 windows 环境中使用 SWIG 创建一个 python 模块。
创建包装类 (example_wrap.cxx) 之后。开始使用 (python setup.py build_ext --inplace) 创建 python 模块。
但我得到 *example_wrap.cxx(3090) : error C2062: type 'int' unexpected*
GradedComplex.h:
class GradedComplex
public:
typedef std::complex<double> dcomplex;
typedef Item<dcomplex> item_type;
typedef ItemComparator<dcomplex> comparator;
typedef std::set<item_type, comparator> grade_type;
private:
int n_;
std::vector<grade_type *> grade_;
std::vector<double> thre_;
public:
GradedComplex(int n, double *thre);
~GradedComplex();
void push(item_type item);
void avg(double *buf);
;
#endif
GradedComplex.cc
GradedComplex::GradedComplex(int n, double *thre)
n_ = n;
for (int i = 0; i < n_; ++i)
thre_.push_back(thre[i]);
grade_.push_back(new grade_type());
然后我构建它以使用 SWIG 生成 python 模块。
Swig 接口文件 (example.i) GradedComplex(int n, double *thre);
我不是 SWIG 接口文件方面的专家
生成的包装类代码量很大,所以我粘贴的很少。
代码:example_wrap.cxx
3083: #define SWIG_FILE_WITH_INIT
3084: #include "Item.h"
3085: #include "GradedComplex.h"
3086: typedef std::complex<double> dcomplex;
3087: typedef Item<dcomplex> item_type;
3088: typedef ItemComparator<dcomplex> comparator;
3089: typedef std::set<item_type, comparator> grade_type;
3090: GradedComplex(int n, double *thre);
3091: void push(item_type item);
3092: void avg(double *buf);
3093: #include <string>
3094: #include <complex>
3095: #include <iostream>
3096: #if PY_VERSION_HEX >= 0x03020000
3097: # define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj))
3098: #else
3099: # define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj))
3100: #endif
GradedComplex 构造函数:
GradedComplex::GradedComplex(int n, double *thre)
n_ = n;
for (int i = 0; i < n_; ++i)
thre_.push_back(thre[i]);
grade_.push_back(new grade_type());
请提出一个纠正这个错误的建议
【问题讨论】:
@KirillKobelev 那是个错误。带来不便敬请谅解 。我已经更正了。 GradedComplex(int n, double *thre);没有返回类型。 它是一个构造函数,添加了更多代码以进行澄清 @svs_swig:“它的构造函数”应该是什么意思?你有GradedComplex(int n, double *thre)
坐在代码中间,而不是在任何类中。不,它不是构造函数。这是一个没有返回类型的函数GradedComplex
。这在 C++ 中是非法的。
【参考方案1】:
您显然在某个头文件 (GradedComplex.h
?) 的某处声明了类 GradedComplex
后来你试图在这一行中使用这个名字
GradedComplex(int n, double *thre);
对于人类读者来说,这行代码可能看起来像是在尝试声明一个独立函数 GradedComplex
。从技术上讲,拥有与现有类同名的函数是合法的。但是,由于您没有为此函数指定返回类型,因此编译器不会将其视为函数声明。编译器认为您正在尝试使用声明符周围的冗余括号声明 GradedComplex
类型的对象,如
GradedComplex (a);
因此,int
的出现会使其混淆,并导致在第 3090 行出现关于意外int
的错误报告。
你想做什么?如果您尝试为GradedComplex
定义构造函数,那么您已经知道如何去做(您自己发布了正确的定义)。 3090行的目的是什么?你为什么写那行?
【讨论】:
【参考方案2】:在 c++ 中不能有没有返回类型的函数。您应该为函数GradedComplex
设置返回类型。构造函数不能这样声明。
【讨论】:
以上是关于错误 C2062:类型 int 意外的主要内容,如果未能解决你的问题,请参考以下文章
TypeError: QTableView(parent: QWidget = None): 参数 1 具有意外类型“int”