C++ 模板成员函数错误

c++ template member function error

本文关键字:函数 错误 成员 C++      更新时间:2023-10-16

我是C++模板的新手。当给定不同的输入类型时,以下代码尝试获取不同类型的数据向量。

MS2013 给出了一些奇怪的错误:

error LNK2019: unresolved external symbol "public: void __thiscall data::get_data<int>(class std::vector<int,class std::allocator<int> > &)const " (??$get_data@H@data@@QBEXAAV?$vector@HV?$allocator@H@std@@@std@@@Z) referenced in function _main

怎么了?使用参数 std::vector& 来指定模板函数是否正确?

新更新:我移出了成员函数定义。主函数中的函数调用也附加了。错误是相同的。

#include "data.h"
int main(int argc, char* argv[])
{
    data d1(2);
    std::vector<int32_t> ld;
    d1.get_data(ld);
    return 0;
}
class data {
private:
    std::vector<int16_t> sdata;     // container for 16-bit fixed point                   
    std::vector<int32_t> ldata;     // container for 32-bit fixed point  
    std::vector<char> cdata;        //   
    std::vector<float> fdata;       // container for 32-bit floating point                
    std::vector<double> ddata;      // container for 64-bit floating point
    int16_t dtype;
public:
    data(int16_t type) :sdata(10, 0), ldata(10, 1), cdata(10, 'c'), 
                        fdata(10, 2.0), ddata(10, 3.00),dtype(type){}
    template <typename T>
    void get_data(std::vector<T>& outdata) const;
};
template <typename T>
void data::get_data(std::vector<T>& outdata) const {
    switch (dtype) {
    case 1:
        outdata = sdata;
        break;
    case 2:
        outdata = ldata;
        break;
    case 3:
        outdata = cdata;
        break;
    case 4:
        outdata = fdata;
        break;
    case 5:
        outdata = ddata;
        break;
    default:
        std::cerr << "Unknown data format" << std::endl;
        break;
    }
}
不需要

模板,你可以这个

class data {
private:
    std::vector<int16_t> sdata;     // container for 16-bit fixedpoint                   
    std::vector<int32_t> ldata;     // container for 32-bit fixed point  
    std::vector<char> cdata;        //   
    std::vector<float> fdata;       // container for 32-bit floating point                
    std::vector<double> ddata;      // container for 64-bit floating point
    int16_t dtype;
public:
    data(int16_t type) :sdata(10, 0), ldata(10, 1), cdata(10, 'c'), fdata(10, 2.0), ddata(10, 3.00),dtype(type)
    {
    }
    void get_data(std::vector<int16_t>& outdata)
    {   outdata = sdata;    }
    void get_data(std::vector<int32_t>& outdata)
    {   outdata = ldata;    }
    void get_data(std::vector<char>& outdata)
    {   outdata = cdata;    }
    void get_data(std::vector<float>& outdata)
    {   outdata = fdata;    }
    void get_data(std::vector<double>& outdata)
    {   outdata = ddata;    }
};

int main(int argc, char* argv[])
{
    data d1(2);
    std::vector<int32_t> ld;
    d1.get_data(ld);
    return 0;
}

您正在尝试在运行时使用编译时构造。这是不可能的。
看声明:

void data::get_data(std::vector<T>& outdata) const

要编译并包含在程序中,编译器需要在编译时知道T的类型。

但是T的类型只有在运行时才知道,因为它是变量dtype的值在函数内部确定的,所以在运行时

你真正想要的要么是一个多态类,要么是一个简单的函数。