在C+中的结构函数之间传递文件路径+;编辑:LNK2019错误已修复 我使用C++头库加载STL文件,然后在VR示例脚本中呈现它们。基本上,我使用我找到的GitHub的parse_stl库。该库包含在我的主include文件中。此文件处理多个结构,如:TriangleSet(此文件生成三角形模型及其坐标和颜色)和Scene(使用TriangleSet并处理渲染)

在C+中的结构函数之间传递文件路径+;编辑:LNK2019错误已修复 我使用C++头库加载STL文件,然后在VR示例脚本中呈现它们。基本上,我使用我找到的GitHub的parse_stl库。该库包含在我的主include文件中。此文件处理多个结构,如:TriangleSet(此文件生成三角形模型及其坐标和颜色)和Scene(使用TriangleSet并处理渲染),c++,struct,C++,Struct,我需要从场景结构中的void函数调用函数loadSTLModel。loadSTLModel是TriangleSet中的void,它随后调用stl::parse\u stl。此函数将文件名作为std::string(显然),但它会给我带来无法理解的链接错误。 这个库工作得很好,我以前测试过它,我在一个类似的示例中使用过它,但这更复杂,在这个示例中我无法正确地传递参数。我很清楚,这个错误是由于我如何将filepath变量传递给不同的函数造成的,但我不知道如何修复它 以下是错误代码: main.obj

我需要从
场景
结构中的void函数调用函数
loadSTLModel
loadSTLModel
TriangleSet
中的
void
,它随后调用
stl::parse\u stl
。此函数将文件名作为
std::string
(显然),但它会给我带来无法理解的链接错误。 这个库工作得很好,我以前测试过它,我在一个类似的示例中使用过它,但这更复杂,在这个示例中我无法正确地传递参数。我很清楚,这个错误是由于我如何将filepath变量传递给不同的函数造成的,但我不知道如何修复它

以下是错误代码:

main.obj:错误LNK2019:未解析的外部符号“struct stl::stl_data\uu cdecl stl::parse_stl(类std::basic_string,类std::allocator>const&”)(?parse_stl@stl@@是吗,奥斯特_data@1@ABV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@@Z)在函数“public:void\uu thiscall TriangleSet::loadSTLModel”中引用(char const*,unsigned int,struct DirectX::XMFLOAT3,struct DirectX::XMFLOAT3)”(?loadSTLModel@TriangleSet@@QAEXPBDIUXMFLOAT3@DirectX@@1@Z)

main.h

struct TriangleSet{
   ...
   void loadSTLModel(const char* filename, uint32_t color, XMFLOAT3 origin, XMFLOAT3 size) {

        XMFLOAT3 s = multXMFLOAT(size, XMFLOAT3(0.5,0.5,0.5));
        XMFLOAT3 o = origin;

        std::string stl_filename = filename;
        auto stlData = stl::parse_stl(stl_filename);
        ...
   }
   ...
}

struct Scene{
  ...

  void Init(){
     ...
     TriangleSet furniture;
        std::string FilePathName = "C:/sampleSTL.stl";
        XMFLOAT3 Origen = { 0.0f, 0.0f, 0.0f };
        XMFLOAT3 Escala = { 1.0f, 1.0f, 1.0f};
        furniture.loadSTLModel(FilePathName.c_str(),0xff383838, Origen,     Escala);
     ...

}
namespace stl {
    struct stl_data {
    std::string name;
    std::vector<triangle> triangles;

    stl_data(std::string namep) : name(namep) {}
  };

  stl_data parse_stl(const std::string& stl_path);
}
parse_stl.h

struct TriangleSet{
   ...
   void loadSTLModel(const char* filename, uint32_t color, XMFLOAT3 origin, XMFLOAT3 size) {

        XMFLOAT3 s = multXMFLOAT(size, XMFLOAT3(0.5,0.5,0.5));
        XMFLOAT3 o = origin;

        std::string stl_filename = filename;
        auto stlData = stl::parse_stl(stl_filename);
        ...
   }
   ...
}

struct Scene{
  ...

  void Init(){
     ...
     TriangleSet furniture;
        std::string FilePathName = "C:/sampleSTL.stl";
        XMFLOAT3 Origen = { 0.0f, 0.0f, 0.0f };
        XMFLOAT3 Escala = { 1.0f, 1.0f, 1.0f};
        furniture.loadSTLModel(FilePathName.c_str(),0xff383838, Origen,     Escala);
     ...

}
namespace stl {
    struct stl_data {
    std::string name;
    std::vector<triangle> triangles;

    stl_data(std::string namep) : name(namep) {}
  };

  stl_data parse_stl(const std::string& stl_path);
}
名称空间stl{
结构stl_数据{
std::字符串名;
向量三角形;
stl_数据(std::string namep):名称(namep){}
};
stl_数据解析_stl(const std::string和stl_path);
}
parse_stl.cpp

namespace stl {
    ...
    stl_data parse_stl(const std::string& stl_path) {
    std::ifstream stl_file(stl_path.c_str(), std::ios::in | std::ios::binary);
    if (!stl_file) {
      std::cout << "ERROR: COULD NOT READ FILE" << std::endl;
      assert(false);    
    }

    char header_info[80] = "";
    char n_triangles[4];
    stl_file.read(header_info, 80);
    ...
    ...

    return info;
  }

}
名称空间stl{
...
stl_数据解析_stl(常量std::string和stl_路径){
std::ifstream stl_文件(stl_path.c_str(),std::ios::in | std::ios::binary);
如果(!stl_文件){

std::cout我已经设法使其工作。问题是链接器没有在parse_stl.cpp中的stl名称空间中查找parse_stl函数。尽管Visual Studio在parse_stl.cpp中编译了代码,并且它包含在项目中,但出于某种原因,链接器没有尝试使用该文件


因此,我设法将整个“stl”名称空间移动到main.cpp文件中,使其正常工作,这样现在链接器就可以正确地找到函数了。

似乎您缺少链接库的功能。您可能有非静态成员函数
std_data::parse_stl
,但您调用了
stl::parse_stl
函数。这是什么
stl
?它是一个名称空间?它是一个类还是一个结构?
parse\u stl
stl
名称空间(如果它是一个名称空间)的成员还是
stl
类或结构(如果它是一个类或结构)的
静态
成员函数你应该学习如何创建一个,这样我们就不必猜测这些东西了。哦,是的,我错过了这一部分,stl是一个名称空间,stl_数据是stl中的一个结构。然后想想你在做什么。
parse_stl
函数应该是
stl_data
的非静态成员函数吗?也许它应该是一个
stati>c
member函数?或者它应该是
stl
名称空间的成员(因为您现在这样称呼它)。