遇到的一个模板问题

    看下面的代码:

#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。

 

你可能感兴趣的:(c,struct,Class)