我正在使用安装说明在linux GNU c++下编译hog-man
@verbatim
$ svn co http://www.openslam.org/data/svn/hog-man
$ cd hog-man/trunk/
$ bash # if not already running
$ source setlibpath
$ ./configure
$ make
@endverbatim
安装Csparse
运行最后一步时出现错误:
from hogman2d.cpp:18:
graph_optimizer_chol.hpp: In member function ‘virtual typename
PG::Edge* AISNavigation::CholOptimizer<PG>::addEdge(typename
PG::Vertex*, typename PG::Vertex*, const typename
PG::TransformationType&, const typename PG::InformationType&)’:
graph_optimizer_chol.hpp:284:25: error: expected primary- expression before ‘&&’ token
if (_guessOnEdges && to->edges().size()==1 && ! to->fixed()){
^
Failed command was:
g++ -fPIC -DLINUX -I/home/sophie/hog-man/trunk
-D_MY_CAST_=reinterpret_cast -I/home/sophie/hog-man/trunk/aislib -fPIC
-O3 -Wall -frtti -mmmx -msse3 -c hogman2d.cpp -o hogman2d.o
in directory /home/sophie/hog-man/trunk/aislib/graph_optimizer_hogman
../../build_tools/Makefile.generic-shared-object:55: recipe for target 'hogman2d.o' failed
make[2]: *** [hogman2d.o] Error 1
Compilation in graph_optimizer_hogman failed.
../build_tools/Makefile.subdirs:10: recipe for target 'all' failed
make[1]: *** [all] Error 1
Compilation in aislib failed.
build_tools/Makefile.subdirs:10: recipe for target 'all' failed
make: *** [all] Error 1
表达式_guessOnEdges有什么问题?
在graphoptimizercholl .h中以如下方式声明:
protected:
using typename GraphOptimizer<PG>::_guessOnEdges;
在GraphOptimizer.h中是这样定义的:
public:
GraphOptimizer();
virtual ~GraphOptimizer();
virtual bool initialize(int rootNode=-1)=0;
virtual int optimize(int iterations, bool online=false)=0;
double chi2() const;
static double chi2(const typename PG::Edge* e);
static void absChi(double& rotationalError, double& translationalError, typename PG::Edge* e_);
void chiStat(ChiStatMap& emap);
void sqError(double& are, double& ate, double& mte, double& mre, const typename PG::EdgeSet* eset=0) const;
virtual const bool& verbose() const { return _verbose; }
virtual bool& verbose() { return _verbose; }
virtual const bool& visualizeToStdout() const { return _visualizeToStdout; }
virtual bool& visualizeToStdout() { return _visualizeToStdout; }
virtual const bool& guessOnEdges() const { return _guessOnEdges;}
virtual bool& guessOnEdges() { return _guessOnEdges;}
virtual void backup();
virtual void restore();
protected:
virtual void backupSubset(typename PG::VertexSet& vset);
virtual void backupSubset(Graph::VertexSet& vset);
virtual void restoreSubset(typename PG::VertexSet& vset);
virtual void restoreSubset(Graph::VertexSet& vset);
bool _verbose;
bool _visualizeToStdout;
bool _guessOnEdges;
using PG::_vertices;
using PG::_edges;
};
在GraphOptimizer.hpp: template <typename PG>
GraphOptimizer<PG>::GraphOptimizer() :
PG(),
_verbose(false), _visualizeToStdout(false), _guessOnEdges(false)
{
}
和在graphoptimizercl .cpp:
56: bool initFromObservations = _guessOnEdges;
所以它被定义了,但是它在哪里初始化,问题是当这个方法执行时它没有初始化吗?
if (_guessOnEdges && to->edges().size()==1 && ! to->fixed()){
to->transformation=from->transformation*mean;
}
return e;
}
using typename GraphOptimizer<PG>::_guessOnEdges;
当你用typename
声明某个东西时,这意味着它是一个类型。
不能在表达式中使用类型。
您也不能在属性上使用using
。
- 删除
using
语句 - 在表达式中使用
this->_guessOnEdges
这给你:
if (this->_guessOnEdges && to->edges().size()==1 && ! to->fixed()){
to->transformation=from->transformation*mean;
}
这里的this
是必要的,它告诉编译器_guessOnEdges
是一个依赖符号,在模板实例化之前不能解析。