我正在处理一个非常简单的模板结构,该模板结构通过其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
。 最佳答案
您可以为SpecialCase添加一个特殊情况,其中参数是相同的:
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++ - 需要 “override”情况: how to avoid the error?时重叠模板部分特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13864451/