2016-02-03 145 views
0

我是新来的C++模板。下面的代码试图在给出不同的输入类型时获取不同类型的数据向量。C++模板成员函数错误

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

error LNK2019: unresolved external symbol "public: void __thiscall data::get_data<int>(class std::vector<int,class std::allocator<int> > &)const " ([email protected]@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@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; 
    } 
} 
+3

删除数据''::从你的成员函数'get_data'。 – BeschBesch

+0

这是一个链接器错误,并且在此之前你必须得到编译错误,因为你不能将大多数成员分配给'std :: vector '。 – molbdnilo

+2

也就是说,模板已被实例化为成员函数'void data :: get_data(std :: vector &outdata)const',并且该函数未通过类型检查。 – molbdnilo

回答

0

你试图在运行时使用编译时结构。这是不可能的。
看声明:

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

被编译并包含在你的程序中,编译器将需要在编译时的T种类就知道

T的类型将被唯一已知的在运行时,因为它是可变dtype确定它在函数内部的值,所以在运行时

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

+0

我附加了调用get_data()的主函数代码。错误是一样的。 – Ming

+0

当然。我的观点并不是声明'main'会使它工作,而是让你明白为什么这个模板方法不能编译。我在答案中不清楚的是什么,如果需要,我可以重新制定 – arainone

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