2016-02-03 299 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; 
}