C
C++Liliput
I have a template function of the type
template<typename T>
const T max(const T& a, const T& b)
{
return a > b ? a : b;
}
I provide a template specialization only for C strings as follows:
template<>
const char* max(const char*& a, const char*& b)
{ -------------------------------------------------------------------------------------------------
}
Now I have the following code in main:
const char* cstr1 = "STRING";
const char* cstr2 = "string";
const char* cstrMax = ::max(cstr1, cstr2);
when I compile this code on my Solaris machine, I keep getting the
error "Could not find a match for max<T>(const char*&, const char*&)"
at the line mentioned above (dotted line ending with ERROR).
Surprisingly when I change my template definition to the following,
everything compiles fine:
template<typename T>
T max(T& a, T& b)
{
return a > b ? a : b;
}
As you can see all I have done is remove the const keyword qualifying
the arguments and the return type. In the first case, I would assume
that the typename should evaluate to "char*" but that obviously does
not happen. In the second case, the typename obviously evaluates to
"const char*" and everything works fine. What is the reason that there
is a compilation error in the first case?
template<typename T>
const T max(const T& a, const T& b)
{
return a > b ? a : b;
}
I provide a template specialization only for C strings as follows:
template<>
const char* max(const char*& a, const char*& b)
{ -------------------------------------------------------------------------------------------------
return strcmp(a, b) > 0 ? a : b;ERROR
}
Now I have the following code in main:
const char* cstr1 = "STRING";
const char* cstr2 = "string";
const char* cstrMax = ::max(cstr1, cstr2);
when I compile this code on my Solaris machine, I keep getting the
error "Could not find a match for max<T>(const char*&, const char*&)"
at the line mentioned above (dotted line ending with ERROR).
Surprisingly when I change my template definition to the following,
everything compiles fine:
template<typename T>
T max(T& a, T& b)
{
return a > b ? a : b;
}
As you can see all I have done is remove the const keyword qualifying
the arguments and the return type. In the first case, I would assume
that the typename should evaluate to "char*" but that obviously does
not happen. In the second case, the typename obviously evaluates to
"const char*" and everything works fine. What is the reason that there
is a compilation error in the first case?