C++ C++;功能模板专门化工作?
我正在阅读,16.5,定义函数模板专门化,对作者给出的示例感到困惑,让我们看看下面的模板函数:C++ C++;功能模板专门化工作?,c++,templates,template-function,C++,Templates,Template Function,我正在阅读,16.5,定义函数模板专门化,对作者给出的示例感到困惑,让我们看看下面的模板函数: template <typename T> int compare(const T&, const T&); 模板int比较(常数T&,常数T&); 及其专门化版本: template <> int compare(const char* const &p1, const char* const &p2) { return strcm
template <typename T> int compare(const T&, const T&);
模板int比较(常数T&,常数T&);
及其专门化版本:
template <>
int compare(const char* const &p1, const char* const &p2)
{
return strcmp(p1, p2);
}
模板
int比较(常量字符*常量和p1,常量字符*常量和p2)
{
返回strcmp(p1,p2);
}
T
的类型将是const char*
,但我不认为该函数可以是模板函数的专门化版本,因为我认为const char*const&p1
只能是T const&
的专门化,但是const T&
,我知道我错了,但我想知道为什么我错了
编辑:
需要强调的一点是,如果我调用
compare(“hi”,“mom”)
,它将不会编译,也就是说,template int compare(const t&,const t&)
不能初始化为int compare(const char*const&p1,const char*const&p2)
,我知道t
将被初始化为char[3]
或char[4],但现在编译不了,为什么编译器不理会这种初始化,而是选择一个编译的?< p> C++,<代码> const t< /COD>和<代码> T const 意思完全相同。因此,const T&
和T const&
的意思完全相同
它实际上不可能是任何其他方式,因为引用永远不能更改为引用其他内容(它们不是“可重新放置的”)。如果您将T const&
理解为“一个不能更改为引用不同T的引用”,则这是不正确的。这是一个对T的引用,它不能用来修改T(并且与所有引用一样,不能改变为引用不同的T)。C++中的< P> >代码> const t< /Cord>和<代码> t const < /Case>意思完全相同。因此,const T&
和T const&
的意思完全相同
它实际上不可能是任何其他方式,因为引用永远不能更改为引用其他内容(它们不是“可重新放置的”)。如果您将T const&
理解为“一个不能更改为引用不同T的引用”,则这是不正确的。它是“对T的引用,不能用于修改该T(与所有引用一样,不能更改为引用不同的T)。const
可以在类型之前或之后,但指针类型除外,指针类型必须位于右侧
现在这里比较棘手的部分是,在您的示例中,T
被设置为const char*
,这是一种指针类型(指向const char
)。模板说明T
必须是const
,并且由于它是指针类型,因此专门化中的const
必须放在类型之后,因此您得到const char*const
从右到左大声朗读时,它会变得更加清晰:
“指向常量字符的常量指针”
//编辑:
为什么你不能打电话给比较(“嗨”,“妈妈”)代码>?因为编译器将这些字符数组视为不同的类型(char[3]
和char[4]
),但模板将这两个参数指定为相同的类型
这将与模板匹配,但与您的专业化不匹配(因为T
现在是char[2]
):
这将使用您的专用方法:
const char * hi = "hi";
const char * mom = "mom";
compare(hi, mom);
//Edit2:
“我知道T将用char[3]或char[4]初始化,…]为什么编译器不忽略这种初始化,而选择一个将编译的呢?”
因为C++是一种强类型语言。编译器不会为您做猜测工作,它会按面值接受类型。如果他们不匹配,他们就不匹配。作为开发人员,您的工作就是正确地执行它。
const
可以在类型之前或之后,但指针类型除外,指针类型必须位于右侧
现在这里比较棘手的部分是,在您的示例中,T
被设置为const char*
,这是一种指针类型(指向const char
)。模板说明T
必须是const
,并且由于它是指针类型,因此专门化中的const
必须放在类型之后,因此您得到const char*const
从右到左大声朗读时,它会变得更加清晰:
“指向常量字符的常量指针”
//编辑:
为什么你不能打电话给比较(“嗨”,“妈妈”)代码>?因为编译器将这些字符数组视为不同的类型(char[3]
和char[4]
),但模板将这两个参数指定为相同的类型
这将与模板匹配,但与您的专业化不匹配(因为T
现在是char[2]
):
这将使用您的专用方法:
const char * hi = "hi";
const char * mom = "mom";
compare(hi, mom);
//Edit2:
“我知道T将用char[3]或char[4]初始化,…]为什么编译器不忽略这种初始化,而选择一个将编译的呢?”
因为C++是一种强类型语言。编译器不会为您做猜测工作,它会按面值接受类型。如果他们不匹配,他们就不匹配。作为开发人员,您的工作就是把它做好。
在const T
和T const
之间没有区别。这解决了你的困惑吗?那么,const T&
与T const&
没有区别吗?const T
与T const
之间没有区别。这解决了你的困惑吗?所以,const T&
与T const&
没有区别,但是如果我调用compare(“hi”,“mom”)代码>,为什么不能模板int比较(常数t&,常数t&)代码>用int compare(cons)初始化