c++ - 具有模板模板参数的类的专业化在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 和标准,似乎并非如此。我也读过虚拟参数,但我不知道应用它,因为我也有可变参数模板。
如果可能的话,我想解决这种问题,而无需修改太多代码。或者至少有一个解决方法。
这是一个工作示例(我忘记了,为此非常感谢):
#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;
}
解决方案
推荐阅读
- doxygen - C中缺少一些调用图
- php - docker-php-ext-install - 尽管安装了扩展,但仍然找不到源
- spring-boot - Spring Boot:如何设置和读取 cookie
- excel - 将大量单元格从一个工作簿移动到另一个工作簿
- powerbi - 此 Power BI 宣传材料中使用了哪些可视化效果?
- sql-server - 使用 SQL 解析 XML
- swift - 如何在 ios 图表中快速设置字符串和 Y 轴数字
- html - 如何为 datetime-local 输入类型指定时间的默认值?
- django - 在 Count 之前排除相关对象
- python - 使用 Popen 打开一个进程无法关闭它(需要在 cmd 中运行 Ros 命令)