I am trying to make my code, already working on clang, compatible with gcc. I have the following main class:
template<typename T, typename...Ts>
class OperatorTypeHelper
{ public:
using type=T;
};
template<typename...Inputs>
using OperatorType=typename OperatorTypeHelper<Inputs...>::type;
Then I do also have a class:
template<typename ConstType,typename...Inputs>
class ConstantTensor;
I want to write a specialisation of OperatorTypeHelper so that it takes binary template template argument as first parameter and another one, which should be more specialised, that specifically takes 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
};
I obtain, from gcc, an ambiguity error, which clang did not gave me. Indeed also the second specialisation can satisfies the arguments of the first one. On the other hand, I would expect the first one to be accepted. Reading on this website, I found out that, for gcc and the standard, does not seem to be the case. I also have read about the dummy argument, but I do not know to apply that since I also have variadic templates.
I would like to solve this kind of issue, if it possibile, without modifying too much the code. Or at least to have a workaround.
Here a working example (which I forgot and thaks super for this):
#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;
}