看下面的代码:
#include <iostream>
using namespace std;
template<typename T> struct Traits
{
static T emptyValue() { return T(); }
};
template<typename T> class Map : public Traits<T>
{
};
class Base
{
};
int main()
{
Map<Base*> m;
Base *b = m.emptyValue();
cout<<b<<endl;
return 0;
}
结果会输出什么呢?
关键在于函数static T emptyValue() { return T(); }。如果传入的T是一个Base,那么可以知道它返回一个Base对象(调用默认构造函数)。但如果T是Base*,会怎么样呢?“Base*()”?这编译通不过!
其实,得这么看这个问题:
typedef Base* PB;
PB pb = PB(); // 这样是正确的。
同样的:
PB pb = PB(0); // pb=0x00000000,PB()也就是该值
PB pb = PB(1); // pb=0x00000001
PB pb = PB(456); // pb=0x000001C8
经过上面的分析,程序的输出就是0x00000000。