分享

关于 error C2143: syntax error : missing ';' before 'tag::id' 的问题

 牛人的尾巴 2014-11-08
在BallTree.h文件中是如下定义的类:
#ifndef __BALL_TREE_H
#define __BALL_TREE_H
#ifdef MEX
#include "mex.h"
#endif
#include <math.h>
#include <stdint.h>
#define FALSE 0
#define TRUE 1
double log(double);
double exp(double);
double sqrt(double);
double pow(double , double);
double fabs(double);
#define PI 3.141592653589

class BallTree {
public:
// typedef unsigned int index;              // define "index" type (long)
typedef uint32_t index;              // define "index" type (long)
  static const  BallTree::index NO_CHILD/* = (index) -1*/; // indicates no further children

/////////////////////////////
  // Constructors
  /////////////////////////////
  
  //BallTree( unsigned int d, index N, double* centers_,
  //     double* ranges_, double* weights_ );
#ifdef MEX
  BallTree();
  BallTree(const mxArray* structure);     // for loading ball trees from matlab
  
  // For creating BallTree structures in matlab:
  static mxArray*  createInMatlab(const mxArray* pts, const mxArray* wts);
#endif
  /////////////////////////////
  // Accessor Functions  
  /////////////////////////////
  BallTree::index root() const              { return 0; }
  unsigned int    Ndim() const              { return dims; }
  index Npts()                    const { return num_points; }
  index Npts(BallTree::index i)   const { return highest_leaf-lowest_leaf+1; }
  const double* center(BallTree::index i)   const { return centers+i*dims; }
  const double* range(BallTree::index i)    const { return ranges +i*dims; }
  double  weight(BallTree::index i)         const { return *(weights+i); }
  bool isLeaf(BallTree::index ind)          const { return ind >= num_points; }
  bool validIndex(BallTree::index ind)      const { return ((0<=ind) && (ind < 2*num_points)); }
  BallTree::index left(BallTree::index i)   const { return left_child; }
  BallTree::index right(BallTree::index i)  const { return right_child; }
  BallTree::index leafFirst(BallTree::index i) const { return lowest_leaf; }
  BallTree::index leafLast(BallTree::index i)  const { return highest_leaf; }
  // Convert a BallTree::index to the numeric index in the original data
  index getIndexOf(BallTree::index i) const { return permutation; }
  void movePoints(double*);
  void changeWeights(const double *);
  // Test two sub-trees to see which is nearer another BallTree
  BallTree::index closer(BallTree::index, BallTree::index, const BallTree&,BallTree::index) const;  
  BallTree::index closer(BallTree::index i, BallTree::index j, const BallTree& other_tree) const
      { return closer(i,j,other_tree,other_tree.root()); };
  void kNearestNeighbors(index *, double *, const double *, int, int) const;
  /////////////////////////////
  // Private class f'ns
  /////////////////////////////
protected:
#ifdef MEX
  static mxArray*  matlabMakeStruct(const mxArray* pts, const mxArray* wts);
#endif
  virtual void calcStats(BallTree::index);     // construction recursion
  unsigned int dims;             // dimension of data
  BallTree::index num_points;     // # of points
  double *centers;                // ball centers, dims numbers per ball
  double *ranges;                 // bounding box ranges, dims per ball, dist from center to one side
  double *weights;                // total weight in each ball
  
  BallTree::index *left_child,  *right_child;  // left, right children; no parent indices
  BallTree::index *lowest_leaf, *highest_leaf; // lower & upper leaf indices for each ball
  BallTree::index *permutation;                // point's position in the original data
  BallTree::index next;                        // internal var for placing the non-leaf nodes
  static const char *FIELD_NAMES[];            // list of matlab structure fields
  static const int nfields;
  // for building the ball tree
  void buildBall(BallTree::index firstLeaf, BallTree::index lastLeaf, BallTree::index root);
  BallTree::index most_spread_coord(BallTree::index, BallTree::index) const;
  BallTree::index partition(unsigned int dim, BallTree::index low, BallTree::index high);
  virtual void swap(BallTree::index, BallTree::index);         // leaf-swapping function
  void select(unsigned int dimension, index position,
         index low, index high);
  double minDist(index, const double*) const;
  double maxDist(index, const double*) const;
  // build the non-leaf nodes from the leaves
  void buildTree();
};
#endif

在BallTree.cpp中是:
#define MEX
#include "cpp/BallTree.h"
#include "mex.h"
const index BallTree::NO_CHILD =index-1;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{

  // check for the right number of arguments
  if(nrhs != 2)
    mexErrMsgTxt("Takes 2 input arguments");
  if(nlhs != 1)
    mexErrMsgTxt("Outputs one result (a structure)");

//                                   points, weights
  plhs[0] = BallTree::createInMatlab(prhs[0],prhs[1]);

}

用的MATLAB和C++联合编程:
报错如下:>> BallTree.cpp

BallTree.cpp(11) : error C2143: syntax error : missing ';' before 'tag::id'
BallTree.cpp(11) : error C2734: 'index' : const object must be initialized if not extern
BallTree.cpp(11) : fatal error C1004: unexpected end of file found

  D:\PROGRA~1\MATLAB\R2009B\BIN\MEX.PL: Error: Compile of 'BallTree.cpp' failed.

非常需要各位大神的帮助。。万分感谢。。另外,因为我省掉了一些说明的话,所以那个行数不太对,所以我给错误的地方用橙色标出来了。。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多