需要"override"案例时重叠模板部分专用化:如何避免错误?
Overlapping template partial specialization when wanting an "override" case: how to avoid the error?
我正在处理一个非常简单的模板结构,该结构的枚举值由其 2 个模板参数是否相同类型来设置。
template<typename T, typename U> struct is_same { enum { value = 0 }; };
template<typename T> struct is_same<T, T> { enum { value = 1 }; };
这是库(Eigen)的一部分,所以我无法在不破坏它的情况下更改此设计。 当value == 0
时,静态断言中止编译。
所以我有一个特殊的数字模板类SpecialCase
,它可以对自己的不同专业进行操作。 所以我设置了一个这样的覆盖:
template<typename T> struct SpecialCase { ... };
template<typename LT, typename RT> struct is_same<SpecialCase<LT>, SpecialCase<RT>> { enum { value = 1 }; };
但是,这会引发错误:
more than one partial specialization matches the template argument list
现在,我明白为什么了。 就是这种情况,LT == RT
踩在is_same<T, T>
的脚趾上。 我不知道的是,如何保持我的SpecialCase
覆盖并摆脱错误。 有没有解决这个问题的技巧?
编辑:为了澄清,我需要所有LT != RT
也被视为相同的情况(值为 1)。 不仅仅是LT == RT
.
您可以为参数相同的特殊情况添加特殊情况:
template < typename T >
struct is_same < SpecialCase < T >, SpecialCase < T > >
{ enum { value = 1 }; };
这比每个模棱两可的候选人都更具体。
编辑:这是完整的代码:
#include <iostream>
template<typename T, typename U> struct is_same {
enum { value = 0 };
};
template<typename T> struct is_same<T, T> {
enum { value = 1 };
};
template<typename T> struct SpecialCase { };
template < typename T >
struct is_same < SpecialCase < T >, SpecialCase < T > >
{
enum { value = 1 };
};
template<typename LT, typename RT> struct is_same<SpecialCase<LT>, SpecialCase<RT> > {
enum { value = 1 };
};
int main ( int, char** )
{
std::cout
<< is_same < SpecialCase < int >, SpecialCase < int > >::value
<< is_same < SpecialCase < int >, SpecialCase < double > >::value
<< is_same < SpecialCase < int >, double >::value
<< is_same < double, SpecialCase < int > >::value
<< is_same < double, double >::value
<< is_same < double, int >::value
<< std::endl;
return 0;
}
相关文章:
- C++类错误中的模板专用化
- 模板专用化会导致未定义的引用错误
- flat_hash_map.h:错误 C3203:"templated_iterator":非专用类模板
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 类模板部分专用化:编译器错误
- 为什么在源文件中专用模板不会导致错误?
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?
- C++模板 - 使用"std::is_same_v"而不是专用并避免编译错误?
- VS2017模板专用化错误无法从'Class *(__cdecl *)(Args...)'转换为'Class *(__cdecl *)(Args...)'
- 函数模板专用化生成链接错误
- 错误 C2908:显式专用化; 已被实例化
- 部分模板专用化错误
- 模板函数专用化的内部编译器错误
- 类模板方法的专用化,类型名称是类模板 - 错误:参数处的类型/值不匹配
- 错误 C2893:无法使用 CTPL 专用化函数模板
- gcc中变量模板的错误显式模板专用化
- Qt nmake:错误 C3203:"map":非专用类模板不能用作模板参数"base"的模板参数,预期为真实类型
- 声明无法解决"实例化后的显式专用化"错误
- 需要"override"案例时重叠模板部分专用化:如何避免错误?