1

我是 C++ 和 SWIG 的新手

我正在 Windows 环境中使用 SWIG 创建一个 python 模块。

创建包装类(example_wrap.cxx)后。开始使用 (python setup.py build_ext --inplace) 创建 python 模块。

但我得到*example_wrap.cxx(3090) : error C2062: type 'int' unexpected*

分级复杂.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

分级复杂.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());
  }
}

请提出一个纠正这个错误的建议

4

2 回答 2

1

在 c++ 中不能有没有返回类型的函数。您应该为函数设置返回类型GradedComplex。构造函数不能这样声明。

于 2012-11-14T18:37:42.803 回答
1

您显然GradedComplex在某个头文件(GradedComplex.h?)的某处声明了类

稍后您尝试在此行中使用此名称

GradedComplex(int n, double *thre);

对于人类读者来说,这行代码可能看起来像是声明一个独立函数的尝试GradedComplex。从技术上讲,拥有与现有类同名的函数是合法的。但是,由于您没有为此函数指定返回类型,因此编译器不会将其视为函数声明。编译器认为您正在尝试使用声明GradedComplex符周围的冗余括号声明类型的对象,如

GradedComplex (a);

出于这个原因,它的出现会int让人感到困惑,并导致int在第 3090 行出现关于意外的错误报告。

你想做什么?如果您尝试为 定义构造函数GradedComplex,那么您已经知道如何去做(您自己发布了正确的定义)。3090行的目的是什么?你为什么写那行?

于 2012-11-14T18:40:32.173 回答