我正在处理一个非常简单的模板结构,该模板结构通过其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/

10-13 06:52