模板类型的奇怪行为

发布于 2024-11-27 16:30:25 字数 479 浏览 1 评论 0原文

#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::type ) == 3。为什么是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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

电影里的梦 2024-12-04 16:30:25

您所做的就是专门化模板,表示只要类型参数为 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).

标点 2024-12-04 16:30:25

您对模板进行了专门化,以便如果类型参数为long*,则大小会发生更改。我相当确定您不能混合使用您想要使用的 testtest<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;
}

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

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 the test<int*> and test<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:

#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;
}

Maybe if you tell us the real problem you're trying to solve that would help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文