C++ 使用struct和bool进行模板专门化

C++ 使用struct和bool进行模板专门化,c++,templates,C++,Templates,我有一个模板类,在这个类中我专门研究了几个方法。出于某种原因,当我为结构添加专门化时,它似乎与bool的专门化相冲突。我得到一个类型转换错误,因为它试图设置struct=bool(解析到错误的专门化)。这里有一些代码 .h: typedef结构foo{ ... } 模板类栏{ 模板void method1(){…} 模板void method1(){…} 模板void method1(){…} } .cpp 模板类栏; 模板类栏; 我在method1中得到错误,因为它设置了T=foo,而不是

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

.h:

typedef结构foo{
...
}
模板类栏{
模板void method1(){…}
模板void method1(){…}
模板void method1(){…}
}
.cpp

模板类栏;
模板类栏;
我在
method1
中得到错误,因为它设置了T=foo,而不是将其解析为
method1


有什么想法吗

代码的第一部分已经不正确。C++不支持“嵌套”(成员)模板的显式特化,而不显式封闭模板的专门化。 在代码的上下文中,如果不显式专门化整个类模板
bar
,则显式专门化模板方法
method1
是非法的

如果您的成员模板函数
member1
依赖于某些参数,则可以使用重载而不是模板专门化作为解决方法。但既然没有,你就必须以某种方式重新设计你的模板。上面所做的,在C++中又是非法的。< /P> 您进一步得到的错误很容易(而且很可能是)由原始问题引起


另外,对您发布的问题的描述意味着您的代码可以编译。由于上述原因,您发布的内容不应编译。这表明您发布的是假代码。发布真实代码。

代码的第一部分已经不正确。C++不支持“嵌套”(成员)模板的显式特化,而不显式封闭模板的专门化。 在代码的上下文中,如果不显式专门化整个类模板
bar
,则显式专门化模板方法
method1
是非法的

如果您的成员模板函数
member1
依赖于某些参数,则可以使用重载而不是模板专门化作为解决方法。但既然没有,你就必须以某种方式重新设计你的模板。上面所做的,在C++中又是非法的。< /P> 您进一步得到的错误很容易(而且很可能是)由原始问题引起

另外,对您发布的问题的描述意味着您的代码可以编译。由于上述原因,您发布的内容不应编译。这表明您发布的是假代码。发布真实代码。

(编辑)

您可以尝试以下操作,将方法实现委托给模板化的助手类

.h:

typedef结构Foo{
...
}
模板结构BarMethod1;
模板类栏
{
模板无效方法1(…)
{
BarMethod1(…)(…);
}
}
模板类BarMethod1
{void操作符()(…){…};
模板类BarMethod1
{void操作符()(…){…};
模板BarMethod1
{void操作符()(…){…};
.cpp

模板类栏;
模板类BarMethod1;
模板类BarMethod1;
模板类栏;
模板类BarMethod1;
模板类BarMethod1;
(已编辑)

您可以尝试以下操作,将方法实现委托给模板化的助手类

.h:

typedef结构Foo{
...
}
模板结构BarMethod1;
模板类栏
{
模板无效方法1(…)
{
BarMethod1(…)(…);
}
}
模板类BarMethod1
{void操作符()(…){…};
模板类BarMethod1
{void操作符()(…){…};
模板BarMethod1
{void操作符()(…){…};
.cpp

模板类栏;
模板类BarMethod1;
模板类BarMethod1;
模板类栏;
模板类BarMethod1;
模板类BarMethod1;

事实上,这在其他类型中也能正常工作。我只在添加了结构专门化后才出现错误。@AdamC:有时编译器会承认代码不符合标准——这里可能就是这种情况。因为显而易见的原因,依赖于这种行为是非常危险的。@ ADAMC:这仅仅意味着编译器提供了一些与C++语言没有太大关系的扩展功能。很难预测这种能力应该如何工作,因为它不受语言的控制。也许你观察到的是预期的行为,也许不是。。。请参考编译器的文档,因为这不是C++,实际上,这是与其他类型一起工作的。我只在添加了结构专门化后才出现错误。@AdamC:有时编译器会承认代码不符合标准——这里可能就是这种情况。因为显而易见的原因,依赖于这种行为是非常危险的。@ ADAMC:这仅仅意味着编译器提供了一些与C++语言没有太大关系的扩展功能。很难预测这种能力应该如何工作,因为它不受语言的控制。也许你观察到的是预期的行为,也许不是。。。请参考编译器的文档,因为这不是C++。同样存在同样的问题:不显式地专门处理内部模板而试图显式地专门化内部模板。即使某些编译器接受它,它仍然是无效的C++。我很惊讶,但我不争辩;我不是标准专家。标准的讨论很有趣,但对我来说,只是一个旁注。对我来说,在最近的gcc和VS上编译和工作的代码更重要@谢谢你的帮助!遭受完全相同的问题:尝试显式地专门化内部模板,而不专门化oute
typedef struct foo {
  ...
}

template <class T> class bar {
   template <class T> void method1() {...}
   template <> void method1<bool>() {...}
   template <> void method1<foo>() {...}
}
 template class bar<bool>;
 template class bar<foo>;
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()(...){...}};
 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>;