As per this article, which says that( emphasis mine ):
Partial template specialization allows us to specialize classes (but not individual functions!)
It seems that function partial template specialization is not allowed. Is that really correct?
What confuses me is that why these code snippets could be compiled successfully:
//demo1.cpp
//first code snippet(https://coliru.stacked-crooked.com/a/0868610b5be94f2c)
//Why this function template specialization compiles?
//Because this is full template specialization other than partial template specialization?Am I right?
#include <iostream>
#include <string.h>
using namespace std;
template <class T>
void f(T)
{
T d;
std::cout <<"first one" << std::endl;
}
template <>
void f<int>(int)
{
int d;
std::cout <<"second one" << std::endl;
}
int main()
{
f(5.0);
f(1);
f('a');
}
Another example:
//demo2.cpp(https://coliru.stacked-crooked.com/a/7b1a94ad377ac1f6)
//Why this function template specialization compiles?
//I think it's function partial template specialization indeed.
#include <vector>
#include <iostream>
using namespace std;
//function template
template<typename T, class N> void compare(T num1, N num2) {
cout << "standard function template" << endl;
if(num1>num2)
cout << "num1:" << num1 << " > num2:" << num2 <<endl;
else
cout << "num1:" << num1 << " <= num2:" << num2 << endl;
}
//function partial template specialization
template<class N> void compare(int num1, N num2) {
cout<< "partitial specialization" <<endl;
if (num1>num2)
cout << "num1:" << num1 << " > num2:" << num2 << endl;
else
cout << "num1:" << num1 << " <= num2:" << num2 << endl;
}
int main() {
compare<int,int>(30,31);//call compare<int,int>(int num1, int num2)
compare(5,9); //call compare<int>(int num1, int num2)
compare(30,'1'); //call compare<char>(int num1, char num2)
}
Why this code snippet could not been compiled whereas the aforementioned two code snippets compile successfully?
#include <vector>
#include <iostream>
using namespace std;
template <class T1, class T2>
void f(){}
template <class T2>
void f<int, T2>(){} //It's function template sepcialization, isn't it? Why it could not be compiled?
int main() {}
Here are the error messages:
main.cpp:9:6: error: non-type partial specialization 'f<int, T2>' is not allowed 9 | void f<int, T2>(){} | ^~~~~~~~~~
EDITED: Thanks to eerorika for the detailed explaination.
One more question raises, how to distinguish the overloading templates and partially specialising function templates?
In other words, why template<class N> void compare(int num1, N num2) is a template overload whereas template <class T2> void f<int, T2>(){} is attempting to partially specialise a function template?