一、问题描述
在改动openvslam源码时,遇到如下问题:
error: ‘keyframe’ is not a member of ‘openvslam::data’
改动为在system.h中加入了如下函数
std::vector<data::keyframe*> get_current_all_keyfrms() const;
报错显示
$:system.h:94:23: error: ‘keyframe’ is not a member of ‘openvslam::data’
std::vector<data::keyframe*> get_current_all_keyfrms() const;
$:system.h:94:32: error: template argument 1 is invalid
std::vector<data::keyframe*> get_current_all_keyfrms() const;
二、问题分析
在网上查了一下其他error: ‘xxx’ is not a member of ‘xxx’的解决办法,大部分都是新加入头文件,keyframe位于openvslam/data/keyframe.h
中,但openvslam/data/keyframe.h
已经加入代码中。
推测openvslam/data/keyframe.h
未成功加入此工程,通过将openvslam/data/keyframe.h
和openvslam/data/mapdatabase.h
都注释掉,重新编译运行。
发现如果头文件没加入进工程,则报错为error: ‘keyframe’ was not declared in this scope
。
因此,编译器可以在keyframe.h头文件中找到keyframe类,但无法确定keyframe类型。
三、解决办法
在代码首部加入声明
namespace data {
class keyframe;//新加入
class camera_database;
class map_database;
class bow_database;
} // namespace data
四、总结
如果下次再遇到此类问题,可以通过以下两种方法:
1.检查头文件是否被正确加入
2.检查类在使用前是否被声明,若未声明,需要提前声明。