【问题标题】:Template specialization with struct and bool使用 struct 和 bool 的模板特化
【发布时间】:2010-07-21 00:01:19
【问题描述】:

我有一个模板类,我在其中专门研究了几个方法。出于某种原因,当我为结构添加专业化时,它似乎与 bool 的专业化冲突。我收到类型转换错误,因为它试图设置 struct = bool (解决错误的专业化)。这是一些代码

.h:

typedef struct foo {
  ...
}

template <class T> class bar {
   template <class T> void method1() {...}
   template <> void method1<bool>() {...}
   template <> void method1<foo>() {...}
}

.cpp

 template class bar<bool>;
 template class bar<foo>;

我在 method1&lt;bool&gt; 中遇到错误,因为它设置 T=foo 而不是将其解析为 method1&lt;foo&gt;。

有什么想法吗?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您的代码的第一部分已经不正确。 C++ 不支持显式特化“嵌套”(成员)模板,而无需显式特化封闭模板。

    在您的代码上下文中,显式特化模板方法 method1 而不显式特化整个类模板 bar 是非法的。

    如果您的成员模板函数member1 依赖于某些参数,您可以使用重载而不是模板特化作为解决方法。但既然它没有,你必须以某种方式重新设计你的模板。您在上面所做的再次在 C++ 中是非法的。

    你得到的错误很容易(而且很可能是)由最初的问题引起的。

    附:您发布的问题的描述意味着您的代码可以编译。由于上述原因,您发布的内容不应编译。这表明您正在发布虚假代码。贴出真实代码。

    【讨论】:

    • 实际上,这适用于其他类型。一旦我添加了结构专业化,我就得到了错误。
    • @AdamC:有时编译器会承认不符合标准的代码——可能就是这种情况。由于显而易见的原因,依赖这种行为是非常危险的。
    • @AdamC:这仅仅意味着您的编译器为您提供了一些与 C++ 语言没有太大关系的扩展功能。很难预测该功能应该如何工作,因为它不受语言的约束。也许您观察到的是预期的行为,也许不是......请查阅编译器的文档,因为这又不是 C++。
    【解决方案2】:

    (已编辑)

    您可以尝试以下方法,它将方法实现委托给模板化帮助器类。

    .h:

    typedef struct Foo {
      ...
    }
    
    template<class T_Bar, class T2> struct BarMethod1;
    template <class T> class Bar 
    {
       template<class T2> void method1(...)
       {
          BarMethod1<Bar, T2>(...)(...);
       }
    }
    template <class T_Bar, class T2> class BarMethod1 
       {void operator()(...){...}};
    template <class T_Bar> class BarMethod1<T_Bar, bool>
       {void operator()(...){...}};
    
    template <class T_Bar> BarMethod1<T_Bar, Foo>
       {void operator()(...){...}};
    

    .cpp

     template class Bar<bool>;
     template class BarMethod1<Bar<bool>, bool>;
     template class BarMethod1<Bar<bool>, Foo>;
     template class Bar<Foo>;
     template class BarMethod1<Bar<Foo>, bool>;
     template class BarMethod1<Bar<Foo>, Foo>;
    

    【讨论】:

    • 遇到完全相同的问题:尝试显式特化内部模板而不特化外部模板。即使某些编译器接受它,它仍然不是有效的 C++。
    • 真的吗?我很惊讶,但我不争辩;我不是标准专家。
    • 标准讨论很有趣,但对我来说,只是作为旁注。在最近的 gcc 和 VS 上编译和工作的代码对我来说更重要。 @Benoit - 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多