模板类型的奇怪行为

时间:2011-08-02 17:24:03

标签: c++ templates template-specialization

#include <iostream>

template<typename T, int = 0>
struct test {
    typedef char type[3];
};

template<int N>
struct test<long *, N> {
    typedef char type[7];
};

int main()
{
    std::cout << sizeof( test<int*>::type ) << std::endl; // 3
    std::cout << sizeof( test<long*>::type ) << std::endl; // 7
    return 0;
}

我期待sizeof( test<long*>::type ) == 3。为什么是7?

2 个答案:

答案 0 :(得分:3)

你所做的是你专门模板,说每当类型参数是long*时,你应该使用模板的第二种形式。对于其他参数,它将使用模板的初始形式(大小为3)。

答案 1 :(得分:1)

您专门设置了模板,以便在类型参数为long*时更改大小。我很确定你不能混合你想要使用的test<int*>test<123>表单(参数的含义是什么类型或值?)。你能做的最好就是:

#include <iostream>

template<typename T, int = 0>
struct test {
    typedef char type[3];
};

template<int N>
struct test<int, N> {
    typedef char type[7];
};

int main()
{
    std::cout << sizeof( test<int*>::type ) << std::endl; // 3
    std::cout << sizeof( test<long*>::type ) << std::endl; // 3
    std::cout << sizeof( test<int, 123>::type ) << std::endl; // 7
    return 0;
}

也许如果你告诉我们你试图解决的真正问题会有所帮助。