以下代码可以正常工作:
#include <type_traits>
template <typename> class AddLayer;
template <template <typename> class TLayer>
struct LayerInputPortSet
{
using type = int;
};
template <>
struct LayerInputPortSet<AddLayer>
{
using type = float;
};
using type = typename LayerInputPortSet<AddLayer>::type;
static_assert(std::is_same_v<type, float>);
但进行以下修改:
#include <type_traits>
template <typename> class AddLayer;
template <template <typename> class TLayer>
struct LayerInputPortSet
{
using type = int;
};
template <>
struct LayerInputPortSet<AddLayer>
{
using type = float;
};
template <template<typename> class TLayer>
struct Sublayer
{
template <typename TInputs>
using LayerType = TLayer<TInputs>;
};
using type = typename LayerInputPortSet<Sublayer<AddLayer>::template LayerType>::type;
static_assert(std::is_same_v<type, float>);
据我了解,由于“类型别名声明引入了可以用作由type-id表示的类型的同义词的名称”,因此Sublayer<AddLayer>::template LayerType
是AddLayer
的别名,因此根据模板的专长,type
应该为float
。
此代码可在GCC上运行,但无法在clang 6,clang 7,clang 8和VS 2019上进行编译。实际上,如果我将最后一行更改为:
static_assert(std::is_same_v<type, int>);
可以在clang 6,clang 7,clang 8和VS 2019上编译代码。
我不知道哪个编译器的行为正确:GCC或Clang / VS?
非常感谢!