- 论坛徽章:
- 0
|
>> 在C++中,字符串字符值的类型是const char[NUM]型,为什么下面的函数调用func("hello", "world");
>> 会匹配到特化版本func<char [6]>?
>> 另一个问题:如果要特化模板形参为const char[NUM]的版本,应该怎么做?
现在对原问题和代码做了修改,问题集中于数组类型和其它类型(下面用的是字符指针类型作对比)在匹配模板及其特化版本时的问题(或者区别?):
从代码及输出得到如下认识:
对于数组类型,下面的那个绿色的const char[NUM]类型的版本似乎没有机会被选用(我没找到方法),无论实参数组是const还是非const,都匹配到形参为非const数组的const引用。而对于指针类型就不一样,从第二个输出结果可看出这两者之间的区别(实在不好文字描述)
#include <iostream>
using namespace std;
template<typename T>
void func (const T &v1, const T &v2) {
cout<<"template"<<endl;
}
template <>
void func<char*> (char* const &v1, char* const &v2) {
cout<<"Specialization: char*"<<endl;
}
template <>
void func<const char*> (const char* const &v1, const char* const &v2) {
cout<<"Specialization: const char*"<<endl;
}
// 下面写法有点奇怪
template <>
void func<const char [6]> ( char const (&v1)[6], char const (&v2)[6]) {
cout<<"Specialization: const char[6]"<<endl;
}
template <>
void func<char [6]> ( char const (&v1)[6], char const (&v2)[6]) {
cout<<"Specialization: char[6]"<<endl;
}
int main()
{
char *p1 = "hello";
char *p2 = "world";
func(p1, p2);
char * const p3 = "hello";
char * const p4 = "world";
func(p3, p4);
const char *p5 = "hello";
const char *p6 = "world";
func(p5, p6);
const char * const p7 = "hello";
const char * const p8 = "world";
func(p7, p8);
char a1[6] = "hello";
char a2[6] = "world";
func(a1, a2);
const char a3[6] = "hello";
const char a4[6] = "world";
func(a3, a4);
return 0;
}
上面代码运行结果为:
Specialization: char*
Specialization: char*
Specialization: const char*
Specialization: const char*
Specialization: char[6]
Specialization: char[6]
然后我把代码中红色部分注释之后,运行结果为:
Specialization: char*
Specialization: char*
template
template
Specialization: char[6]
Specialization: char[6]
[ 本帖最后由 tyc611 于 2007-2-2 17:13 编辑 ] |
|