#include <iostream>
template<typename T>
void foo(T, T){
std::cout << "Version 1" << std::endl;
}
template<typename T, typename U>
void foo(T, U){
std::cout << "Version 2" << std::endl;
}
int main(){
// Call "Version 1" due to partial ordering.
// I.e, the Version 1 is more specialied than "Version 2"
foo(4, 1);
// Call "Version 2"
foo(1, 2U);
return 0;
}
#include <iostream>
template<typename T>
void foo(T*){
std::cout << "Version 1" << std::endl;
}
template<typename T>
void foo(T){
std::cout << "Version 2" << std::endl;
}
int main(){
int ia[10];
// Call "Version 1" due to partial ordering.
// I.e, the Version 1 is more specialied than "Version 2"
foo(ia);
return 0;
}
#include <iostream>
template<typename T, typename U>
void foo(T*){
std::cout << "Version 1" << std::endl;
}
template<typename T>
void foo(T&){
std::cout << "Version 2" << std::endl;
}
int main(){
// Call version 2
// Since we cannot deduce temlplate parameter U
int ia[10];
foo(ia);
return 0;
}
#include <iostream>
template<typename T>
void foo(T*){
std::cout << "Version 1" << std::endl;
}
template<typename T>
void foo(T&){
std::cout << "Version 2" << std::endl;
}
int main(){
// Call "Version 1"
int ia[10];
foo(ia);
return 0;
}
#include <iostream>
template<typename T>
void foo(T){
std::cout << "Version 1" << std::endl;
}
template<typename T>
void foo(T&){
std::cout << "Version 2" << std::endl;
}
int main(){
// Ambiguous call
int ia[10];
foo(ia);
return 0;
}