首页 > 解决方案 > 具有模板模板参数的类的专业化在clang中但在gcc中不起作用

问题描述

我正在尝试使我的代码(已经在 clang 上工作)与 gcc 兼容。我有以下主要课程:

template<typename T, typename...Ts>
class OperatorTypeHelper
{ public:
  using type=T;
};

template<typename...Inputs>
using OperatorType=typename OperatorTypeHelper<Inputs...>::type;

然后我也有一堂课:

template<typename ConstType,typename...Inputs>
class ConstantTensor; 

我想编写一个特化的,OperatorTypeHelper以便它将二进制模板模板参数作为第一个参数,另一个应该更专业的参数,它专门采用 ConstantTensor:

template<typename ConstType,typename...Inputs, typename QRule>
class OperatorTypeHelper<ConstantTensor<ConstType,Inputs...>,QRule >
{ public:
\\ do staff 
};

template<template<class,class>class Binary,typename Left, typename Right, typename...Ts>
class OperatorTypeHelper< Binary< Left, Right >, Ts...>
{ public:
\\ do staff 
};

我从 gcc 获得了一个歧义错误,clang 没有给我。事实上,第二个专业化也可以满足第一个专业化的论点。另一方面,我希望第一个被接受。在这个网站上阅读,我发现对于 gcc 和标准,似乎并非如此。我也读过虚拟参数,但我不知道应用它,因为我也有可变参数模板。

如果可能的话,我想解决这种问题,而无需修改太多代码。或者至少有一个解决方法。

这是一个工作示例(我忘记了,为此非常感谢):

https://godbolt.org/z/VDAaLD

#include <functional>
#include <map>
#include <string>

template<typename T, typename...Ts>
class OperatorTypeHelper
{ public:
  using type=T;
};


template<typename ConstType,typename...Inputs>
class ConstantTensor {};

template<typename ConstType,typename...Inputs, typename QRule>
class OperatorTypeHelper<ConstantTensor<ConstType,Inputs...>,QRule >
{ public:
// do staff 
};

template<template<class,class>class Binary,typename Left, typename Right, typename...Ts>
class OperatorTypeHelper< Binary< Left, Right >, Ts...>
{ public:
// do staff 
};

template <typename L, typename R>
struct Bin {};

int main() {
    OperatorTypeHelper<ConstantTensor<int, int>, int> i;
    OperatorTypeHelper<Bin<int, int>, int> i2;
}

标签: c++templatesgccclangtemplate-specialization

解决方案


推荐阅读