Следното не изглежда като частичноспециализация (която обаче не може да се случи на функция с шаблони). Плюс функции Дон "т претоварване от просто връщане тип. Какво се случва в следния код ??
#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 за отговор № 1Имате две претоварвания 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
които приемат един аргумент на шаблон и няма начин за компилатора да знае кой от тях сте имали предвид - така че сега имате гарантирано неопределено претоварване.
0 за отговор № 2
Няма да го наричам претоварване, но компилаторът ще генерира две различни функции въз основа на аргументите на шаблоните.