c++ - 模板类内部类的模板特化

标签 c++ templates

给出以下代码

template<typename T>
struct A{
  struct In{};

};

template<typename T>
struct Desc{
};


template<typename X>
struct Desc<typename A<X>::In> {
};



int main(){
  Desc<A<int>::In> a;
}

编译器拒绝 DES 特化

error: template parameters not used in partial specialization:
error:         ‘X’

如果结构体是由以下定义的,则相同

template<>
template<typename X>
struct Desc<typename A<X>::In> {
};

定义

template<typename X>
template<>
struct Desc<typename A<X>::In> {
};

报错

desc.cpp:14:10: error: invalid explicit specialization before ‘>’ token
desc.cpp:14:10: error: enclosing class templates are not explicitly specialized
desc.cpp:15:8: error: template parameters not used in partial specialization:
desc.cpp:15:8: error:         ‘X’

这是像这里一样的“非推导上下文”的情况吗?

Template parameters not used in partial specialization

这是有道理的,因为不能保证内部类实际上是一个类(我们只知道它是一个类型名,它可能是一个 typedef)。 那么有没有办法指定它是一个真正的类?

最佳答案

有没有办法指定它是一个真正的类

不,如果您在部分模板特化中使用此类型,则无法指定。

只有两种方法。专业Desc用于混凝土A ,所以,

template<>
struct Desc<typename A<type>::In> { };

或者使用类似的东西

template<typename T, typename  = void>
struct Desc{
};


template<typename X>
struct Desc<X, typename A<X>::In> {
};

或者当然专门针对 A<X> 类型不适合A<X>::In .

关于c++ - 模板类内部类的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090737/

相关文章:

c++ - 'deep' 模板参数推导是否可行?

c# - 是否有基于 T4 旁边的模板生成 Razor View (.cshtml) 的方法?

c++ - 在 VB.Net 中继续 C++ 项目?

c++ - 有没有办法否定一个对象是否存在函数?

c++ - 使用指向数据成员的指针作为非类型模板参数

c++ - 从 xsd :extension 获取 C++ 对象

c++ - C++中的模板化全局结构

c++ - 计算有限面额的变化

c++ - 错误 LNK2001 : unresolved external symbol "public: double __thiscall

c++ - 如何在子小部件下使用eventfilter来捕获自定义事件