template<typename T>
void f( T, const T ) {}
class A {};
voidOnStart()
{
A * const a = new A;
f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
template<typename T>
struct B {
void f( T, const T ) {}
};
class A {};
voidOnStart()
{
const A* a;
B<const A*> b;
b.f( a, a ); //нормально
}
所以这很好。原则上有什么变化?
template<typename T>
void f( T, const T ) {}
class A {};
voidOnStart()
{
const A *a;
f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
为什么两者都要编译?
一般来说,我很少使用模板--我没有详细说明--我只能在直观的层面上进行解释
在第二种情况下,将T直接替换为A*可以很好地编译--所以模板也应该可以编译了
在第一种情况下,直接替换不起作用,但你可以添加多余的参数T2--有它就能正常编译--没有它也应该这样--这就是为什么它是多余的。
直观地说,const有时是一个类型的一部分,有时只是一个标识符,那在函数里面的指针将是const。
这可以通过Print(__FUNCSIG__)来感受。
编译错误
这就是它的编译方式,原版应该不是。
为什么?
所以这很好。原则上有什么变化?
什么东西发生了根本性的变化?
差异是巨大的!这就是你打电话来的原因。
编译器的错误在于它无法找出模板的正确版本。显然是告诉它的。而且它正在发挥作用。
而且它正在发挥作用。
为什么要多出这些字符?
为什么要多出这些字符?
为了表明编译器并没有猜测到模式的完全可行的版本。
为了表明编译器并没有猜测到模式的完全可行的版本。
为什么要这样呢?ServiceDesk可以自己解决这个问题
为什么?