以下代码编译,但不起作用:
template<typename T>
struct Nesting
{
template<typename U>
struct _Nested
{
};
template<typename U>
using Nested = _Nested<U>;
};
template<typename T>
struct F
{
static constexpr bool is_my_nested_class = false;
};
template<typename T, typename U>
struct F<typename Nesting<T>::Nested<U>>
{
static constexpr bool is_my_nested_class = true;
};
我创建了这些嵌套和嵌套类型,并尝试在其上使用类型特征模式.它编译(使用MSVC 2014 w / CPP11),但是
F<Nesting<int>::Nested<long>>::is_my_nested_class
返回false.
标准是禁止还是未定义?它破坏了什么规则?任何解决方法?
非常感谢你!
最佳答案 您的嵌套别名可以引用任何类型,特别是在专业化中:
template<typename T>
struct Nesting
{
template<typename U>
struct _Nested
{
};
template<typename U>
using Nested = _Nested<U>;
};
// Consider this specialisation:
template<>
struct Nesting<int>
{
template<typename U>
using Nested = float;
};
现在,显然F< Nesting< int> :: Nested< int>> :: is_my_nested_class应该与F< float> :: is_my_nested_class相同,但是,编译器如何在后一种情况下推导出这个?也就是说,如果我写道:
static_assert(F<float>::is_my_nested_class, "not nested");
编译器需要看到F< float>与F< Nesting< int> :: Nested< int>>相同,即使后者尚未实例化.由于无法合理地预期这样做,因此该案件是不允许的.