首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以下模板代码的奇怪行为

以下模板代码的奇怪行为
EN

Stack Overflow用户
提问于 2012-01-12 02:48:46
回答 1查看 82关注 0票数 1

在下面的代码中,当表示的代码被注释掉时,代码会按预期工作-- Type与(第一个)模板参数匹配。

但是,如果我取消对它的注释,Type将变成char而不是std::string。MSVC和GCC都是如此。因此,当我为具有一个和两个参数的标记模板专门化StripTag时,它可以工作,但当我以完全相同的方式为三个参数专门化它时,我得到了这个奇怪的行为。

有谁有什么想法吗?

代码如下:

代码语言:javascript
运行
复制
#include <typeinfo>
#include <stdio.h>
#include <string>

template <typename T>
struct StripTag
{typedef T Type;};

template<typename T, template<typename T> class Tag >
struct StripTag<Tag<T> >
{ typedef typename StripTag<T>::Type Type; };

template<typename T, typename X, template<typename T, typename X> class Tag >
struct StripTag<Tag<T,X> >
{ typedef typename StripTag<T>::Type Type; };

/*
//UNCOMMENT THIS AND RECOMPILE
template<typename T, typename X, typename Y, template<typename T, typename X, typename Y> class Tag >
struct StripTag<Tag<T,X,Y> >
{ typedef typename StripTag<T>::Type Type; };
*/

template <class C>
struct Test
{
typedef C Type;
};

template <typename A, typename B>
struct Blah{};

int main()
{

    printf("typeid of StripTag=\t%s\n", typeid(StripTag<std::string>::Type).name());
    printf("typeid of StripTag2=\t%s\n", typeid(StripTag<Blah<std::string, bool> >::Type).name());
    printf("typeid of Test=\t\t%s\n", typeid(Test<std::string>::Type).name());
    printf("typeid of std::string=\t%s\n", typeid(std::string).name());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-12 02:55:09

这是因为std::string实际上只是一个

代码语言:javascript
运行
复制
std::basic_string<char, std::char_traits<char>, std::allocator<char>>

如您所见,这是一个具有三个类型参数的类模板。

当您有一个接受三参数类模板作为其参数之一的StripTag专门化时,该专门化比主类模板更适合std::string (因为它更具体)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8824906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档