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

时间:2017-08-23 09:32:14

标签: c++ function templates return

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

我有以下内容:

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

我尝试做的可能吗?

谢谢!

---------- --------- EDIT

将实现放在标题中确实有效。但是,如果您希望在.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);

2 个答案:

答案 0 :(得分:1)

很可能你刚才在.cpp文件而不是.h中定义了你的函数模板。这就是为什么在t.getData<int>(0)上出现链接器错误的原因。 如果是这种情况,请阅读format operator

答案 1 :(得分:0)

我刚刚运行了以下程序并且编译得很好。

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