模板化函数重载返回类型

时间:2015-07-01 19:07:51

标签: c++

以下看起来不像是部分特化(但不能在模板化函数上发生)。加上函数不会因返回类型而过载。以下代码中发生了什么?

#include <iostream>
#include <string>
#include <vector>

template<typename T>
T foo() {
 std::cout << "first";
 return T();   
}


template<typename T, typename U>
std::pair<T,U> foo() {
 std::cout << "second";
 return std::make_pair<T,U>(T(),U()); 
}

int main()
{
    foo<int>();
    foo<int,char>();
}

2 个答案:

答案 0 :(得分:2)

您有两个foo重载(实际上有两个名为foo的函数模板)。一个模板类型参数:

template<typename T>
T foo();

一个人需要两个模板类型参数:

template<typename T, typename U>
std::pair<T,U> foo();

您可以在不同的模板参数上重载。您甚至可以添加带有非类型参数的重载:

template <int I>
void foo() {
    std::cout << "third";
}

这也是一个单独的有效重载。你不能做的就是单独添加:

template <typename U>
U* foo();

因为现在你有两个名为foo的不同函数模板,它们采用单个模板参数,编译器无法知道你的意思 - 所以现在你有一个保证模糊的重载。

答案 1 :(得分:0)

我不会将其称为重载,但编译器将根据模板参数生成两个不同的函数。