C++ 为什么std::string和std::vector没有像我所期望的那样传递给我的构造函数?

C++ 为什么std::string和std::vector没有像我所期望的那样传递给我的构造函数?,c++,class,c++11,constructor,C++,Class,C++11,Constructor,这是我在尝试编译时的错误: Undefined symbols for architecture x86_64: "Model::Model(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<int, std::__1::allocator<int> >)", refere

这是我在尝试编译时的错误:

Undefined symbols for architecture x86_64:
    "Model::Model(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<int, std::__1::allocator<int> >)", referenced from: ____C_A_T_C_H____T_E_S_T____4() in tests.cpp.o
架构x86_64的未定义符号: “Model::Model(std::uuu 1::basic_string,std:uu 1::vector)”,引用自tests.cpp.o中的:uuuuu C_ua_ut_uc_uh_ut_ue_us_ut_u4() 我读到std::string是std::basic_string的typedef,我猜std::vector是。。。std::vector和std::分配器?或者别的什么

无论如何。我有一个保存我的设置的设置类和一个包含我的模型的模型类。我试图运行的代码如下所示,我无法编译它。问题在于它无法识别我的模型构造函数

Settings s = Settings("../config/settings.json");
std::string mf = s.get_model_file();
std::vector<int> vec = s.get_input_shape();
Model m = Model(mf, vec);
Settings=Settings(“../config/Settings.json”);
std::string mf=s.get_model_file();
std::vector vec=s.get_input_shape();
模型m=模型(mf,vec);
以下是我的模型类标题供参考:

class Model {
public:
  Model(std::string model_file, std::vector<int> input_shape);
  ~Model();
  double* get_ref_to_input_buffer();
  std::string predict();

private:
  std::string _model_file;
  fdeep::model _model;

  fdeep::shape3 _input_shape;
  int _input_size;
  double* _input_buffer;
  fdeep::tensor3s _result;

  void _load_model();
  void _set_input_size(std::vector<int> input_shape);
  void _set_input_shape(std::vector<int> input_shape);
  void _create_input_buffer();
  std::string _result_to_string();
};
类模型{
公众:
模型(std::字符串模型_文件,std::向量输入_形状);
~Model();
double*获取\u ref\u到\u input\u buffer();
std::string predict();
私人:
std::string\u model\u文件;
fdeep::model\u model;
fdeep::shape3 _输入_形状;
输入大小;
双*输入缓冲区;
fdeep::tensor3s_结果;
void _load_model();
void设置输入大小(标准::矢量输入形状);
void _set _input _shape(标准::向量输入_shape);
void _创建_输入_缓冲区();
std::string _result_to_string();
};
和我的模型类构造函数:

Model::Model(std::string model_file, std::vector<int> input_shape) {
      _model_file = model_file;
      _load_model();
      _set_input_size(input_shape);
      _set_input_shape(input_shape);
}
void Model::_load_model() { _model = fdeep::load_model(_model_file); }

void Model::_set_input_size(std::vector<int> input_shape) {
  int total = 1;
  for (std::vector<int>::iterator it = input_shape.begin();
      it != input_shape.end(); ++it) {
    total *= *it;
  }
  _input_size = total;
}

void Model::_set_input_shape(std::vector<int> input_shape) {
  _input_shape = fdeep::shape3(input_shape[0], input_shape[1], input_shape[2]);
}
Model::Model(std::string Model_文件,std::vector input_形状){
_模型文件=模型文件;
_加载_模型();
_设置输入大小(输入形状);
_设置输入形状(输入形状);
}
以下是在构造函数中调用的函数:

Model::Model(std::string model_file, std::vector<int> input_shape) {
      _model_file = model_file;
      _load_model();
      _set_input_size(input_shape);
      _set_input_shape(input_shape);
}
void Model::_load_model() { _model = fdeep::load_model(_model_file); }

void Model::_set_input_size(std::vector<int> input_shape) {
  int total = 1;
  for (std::vector<int>::iterator it = input_shape.begin();
      it != input_shape.end(); ++it) {
    total *= *it;
  }
  _input_size = total;
}

void Model::_set_input_shape(std::vector<int> input_shape) {
  _input_shape = fdeep::shape3(input_shape[0], input_shape[1], input_shape[2]);
}
void模型::_load_Model(){_Model=fdeep::load_Model(_Model_file);}
无效模型::\设置\输入\大小(标准::矢量输入\形状){
整数合计=1;
对于(std::vector::iterator it=input_shape.begin();
it!=输入_shape.end();++it){
总数*=*它;
}
_输入尺寸=总尺寸;
}
无效模型::_集_输入_形状(标准::向量输入_形状){
_input_shape=fdeep::shape3(input_shape[0],input_shape[1],input_shape[2]);
}
如果有人能指出我哪里做错了,或者告诉我需要阅读/学习的内容,那就太好了。谢谢大家!

根据

“未定义符号”通常表示链接问题。您是否确实正确链接到相应的库

你的代码编译得很好。然后链接器在库中查找正确的函数,由于您是为架构x86_64编译的,因此它会查找正确的库,类似地编译过,但没有找到。这表明(除非您只是忘记链接到64位库),您已经获得了32位版本的库。你的选择是:

  • 构建32位的代码,这样就可以使用现有的库
  • 获取库源代码,并为x86_64自行编译
  • 无论你在哪里找到这个库,都要去寻找,希望你上次找到的32位版本旁边有一个x86_64版本

    “未定义符号”通常表示链接问题。您是否确实正确链接到相应的库

    你的代码编译得很好。然后链接器在库中查找正确的函数,由于您是为架构x86_64编译的,因此它会查找正确的库,类似地编译过,但没有找到。这表明(除非您只是忘记链接到64位库),您已经获得了32位版本的库。你的选择是:

  • 构建32位的代码,这样就可以使用现有的库
  • 获取库源代码,并为x86_64自行编译
  • 无论你在哪里找到这个库,都要去寻找,希望你上次找到的32位版本旁边有一个x86_64版本
    通过采纳@Aconcagua的建议,我使用以下命令从cmake输出链接器命令:

    make tests VERBOSE=1

    这给了我:

    usr/bin/g++-Wl、-search\u paths\u first-Wl、-headerpad\u max\u install\u名称CMakeFiles/tests.dir/tests.cpp.o CMakeFiles/tests.dir/\uu/Settings.cpp.o-o../../bin/tests

    注意到它没有
    Model.cpp.o
    文件,我检查了CMakeLists.txt并发现:

    add_可执行文件(tests.cpp../Settings.cpp../Model.hpp)

    请注意,对于模型,我输入的是头文件,而不是源文件。将其更改为:

    add_可执行文件(tests.cpp../Settings.cpp../Model.cpp)


    修复了我的问题。

    根据@Aconcagua的建议,我使用以下命令从cmake输出链接器命令:

    make tests VERBOSE=1

    这给了我:

    usr/bin/g++-Wl、-search\u paths\u first-Wl、-headerpad\u max\u install\u名称CMakeFiles/tests.dir/tests.cpp.o CMakeFiles/tests.dir/\uu/Settings.cpp.o-o../../bin/tests

    注意到它没有
    Model.cpp.o
    文件,我检查了CMakeLists.txt并发现:

    add_可执行文件(tests.cpp../Settings.cpp../Model.hpp)

    请注意,对于模型,我输入的是头文件,而不是源文件。将其更改为:

    add_可执行文件(tests.cpp../Settings.cpp../Model.cpp)


    修复了我的问题。

    class
    Model
    在其声明中不继承
    \u Model
    类,您定义构造函数并在其中调用基构造函数<代码>:_模型(fdeep::加载_模型(模型文件)您的可能是一个配置错误。您没有链接实现构造函数的对象文件。旁注:
    std::vector
    只是一个普通模板-虽然有默认的模板参数,但没有涉及
    typedef
    s。@IvanRubinson,因为C++17这两个代码是same@KevinGlasson只是另一个提示链接器