std::vector<std::vector<float>> 在头文件中抛出错误 LNK1120

std::vector<std::vector<float>> in header file throws error LNK1120

我想包含我自己的头文件,但是 vector> 抛出错误

matrix.cpp


#include <vector>

class Matrix
{
public:
    std::vector<std::vector<float>> data;
    Matrix(std::vector<std::vector<float>> d_data = { {} })
    {
        data = d_data;
    }

};

matrix.h


#ifndef MATRIX_H
#define MATRIX_H

#include <vector>


class Matrix {
public:
    std::vector<std::vector<float>> data;
    Matrix(std::vector<std::vector<float>> d_data = { {} });
};

#endif

matrixc++.cpp

#include <C:\Users\Matteo\source\repos\matrixc++\matrixc++\Matrix.h>
#include <vector>

int main()
{
    Matrix abc({{1,2},{2,1}});
    return 0;
}

出现以下错误:

matrixc++.obj : error LNK2019: unresolved external symbol "public: __cdecl Matrix::Matrix(class std::vector<class std::vector<float,class std::allocator >,class std::allocator<class std::vector<float,class std::allocator > > >)" (??0Matrix@@QEAA@V?$vector@V?$vector@MV?$allocator@M@std@@@std@@V?$allocator@V?$vector@MV?$allocator@M@std@@@std@@@2@@std@@@Z) referenced in function main

问题 是您或多或少地复制粘贴了 class 定义到源文件 matrix.cpp。也就是说,您定义了 class Matrix 两次。一次在 header 中,第二次在源文件中。

解决这只是在源文件中提供构造函数Matrix::Matrix(std::vector<std::vector<float>>)的实现,如下所示:

matrix.cpp

#include <C:\Users\Matteo\source\repos\matrixc++\matrixc++\Matrix.h>

//implement only the constructor
Matrix::Matrix(std::vector<std::vector<float>> d_data): data(d_data)
                                                        ^^^^^^^^^^^^ use constructor initializer list
{
    
}

matrix.h

#ifndef MATRIX_H
#define MATRIX_H

#include <vector>


class Matrix {
public:
    std::vector<std::vector<float>> data;
    Matrix(std::vector<std::vector<float>> d_data = { {} });
};

#endif

Working demo