模板类型的奇怪行为
#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
。为什么是7?
#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;
}
I expected sizeof( test<long*>::type ) == 3
. Why it is 7?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您所做的就是专门化模板,表示只要类型参数为 long*,您就应该使用模板的第二种形式。对于其他参数,它将使用模板的初始形式(大小为 3)。
What you did is you specialized the template, saying that whenever the type argument is
long*
, you should use the second form of the template. For other arguments, it will use the initial form of the template (with size 3).您对模板进行了专门化,以便如果类型参数为
long*
,则大小会发生更改。我相当确定您不能混合使用您想要使用的test
和test<123>
形式(参数可以是类型或值?)。你能做的最好的事情就是:也许如果你告诉我们你想要解决的真正问题会有所帮助。
You specialized your template so that if the type argument is
long*
then the size is changed. I'm fairly sure you can't mix thetest<int*>
andtest<123>
forms that you want to use (what would the meaning be of a parameter that could be either a type OR a value?). The best you can do is something like:Maybe if you tell us the real problem you're trying to solve that would help.