以下看起来不像是部分特化(但不能在模板化函数上发生)。加上函数不会因返回类型而过载。以下代码中发生了什么?
#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>();
}
答案 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)
我不会将其称为重载,但编译器将根据模板参数生成两个不同的函数。