我是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;
}
}
答案 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
的值,它在函数内部确定它,所以在的运行时即可。
你真正想要的是多态类或简单函数。