向量返回值中的C++模板参数

问题描述:

我有一个具体问题,我无法真正找到有关模板成员函数的所有问题的答案。我想写一个函数来获取一些数据并将其作为特定类型的向量返回。向量返回值中的C++模板参数

我有以下几点:

#include <vector> 

class testClass 
{ 
public: 
    template <typename T> std::vector<T> getData(int column); 
}; 


template <typename T> std::vector<T> testClass::getData(int column){ 
    std::vector<T> returnData; 
    return returnData; 
} 

,并调用该函数:

int main() 
{ 
    testClass t; 
    std::vector<int> data = t.getData(0); 
    return 0; 
} 

当编译此我得到的错误:

../templateTest/main.cpp:9:31: error: no matching member function for call to 'getData' 
    std::vector<int> data = t.getData(0); 
          ~~^~~~~~~ 
../templateTest/testclass.h:8:42: note: candidate template ignored: couldn't infer template argument 'T' 
    template <typename T> std::vector<T> getData(int column); 
             ^

好了,所以它可以”从返回类型的模板中获取模板参数。为了解决这个问题我尝试包括呼叫模板参数:

int main() 
{ 
    testClass t; 
    std::vector<int> data = t.getData<int>(0); 
    return 0; 
} 

这编译,但给了我一个链接错误:

Undefined symbols for architecture x86_64: 
    "std::__1::vector<int, std::__1::allocator<int> > testClass::getData<int>(int)", referenced from: 
     _main in main.o 

最后一个尝试是还包括在函数模板参数定义:

class testClass 
{ 
public: 
    template <typename T> std::vector<T> getData<T>(int column); 
}; 

然而,这并不编译...:

../templateTest/testclass.h:8:42: error: member 'getData' declared as a template 
    template <typename T> std::vector<T> getData<T>(int column); 

我可以尝试做什么?

谢谢!

----------编辑---------

将实现放在标题中确实有效。如果你更喜欢在.cpp中实现你的实现。添加计划使用的每个实现的最后一行。

#include "testclass.h" 

template <typename T> std::vector<T> testClass::getData(int column){ 
    std::vector<T> returnData; 
    return returnData; 
} 

template std::vector<int> testClass::getData(int column); 
+0

[点击进入](https://ideone.com/qgCspR)效果很好 –

+0

[无法重现](http://coliru.stacked-crooked.com/a/3863947b2783a280)。 – YSC

+0

是的,我也只是用GCC 7测试过。 – ypnos

我刚跑了下面的程序,它编译得很好。

#include <vector> 

class testClass 
{ 
public: 
    template <typename T> std::vector<T> getData(int column); 
}; 


template <typename T> std::vector<T> testClass::getData(int column){ 
    std::vector<T> returnData; 
    return returnData; 
} 

int main() 
{ 
    testClass t; 
    std::vector<int> data = t.getData<int>(0); 
    return 0; 
} 

使用模板,您不应该为函数使用单独的cpp文件。确保将定义放在头文件中。这是必要的,因为任何类型都可以在模板中传递,编译器需要为每个不同类型的函数创建一个新版本。在处理模板时,我经常只在类中定义函数。

class testClass 
{ 
public: 
    template <typename T> std::vector<T> getData(int column){ 
     std::vector<T> returnData; 
     return returnData; 
    } 
}; 
+0

甜蜜,谢谢!我确实在一个单独的cpp文件中定义了这个函数。 – YugT

+0

就像一些额外的信息。如果你想把你的代码放在cpp中,你可以添加特定的实现到你的cpp文件中。它会然后链接。所以在使用的情况下,让我们说,int和双加: – YugT

+0

模板std :: vector testClass :: getData(int column); template std :: vector testClass :: getData(int column); – YugT

很有可能您刚刚在.cpp文件中定义了您的函数模板而不是.h。这就是为什么你在t.getData<int>(0)上遇到链接错误。 如果是这样,请阅读this post

+0

是的,你是对的!谢谢! – YugT