c ++模板成员函数错误

时间:2016-02-03 23:40:08

标签: c++ templates

我是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&amp;是否不正确?指定模板函数?

新更新: 我移出了成员函数定义。 还附加了main函数中的函数调用。错误是一样的。

#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;
    }
}

2 个答案:

答案 0 :(得分:1)

不需要模板,你可以这个

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;
}

答案 1 :(得分:0)

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

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

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

T的类型只能在运行时中知道,因为它是变量dtype的值,它在函数内部确定它,所以在的运行时即可。

你真正想要的是多态类或简单函数。