C++编译器忽略具有模板化类型的类专用化
C++ Compiler ignoring class specialization with templatized type
我有一个助手类,用于向另一个类提供部分专用的方法版本。我有主要的模板和两个专业:
template<typename BASE, typename ACCESS_METHOD, int MODULE>
struct BaseHelper
{
void f1()
{
....
}
}
template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
void f1()
{
....
}
}
template<typename BASE, int MODULE>
struct BaseHelper< BASE, uint32_t, MODULE >
{
void f1()
{
....
}
}
如果执行以下操作:
FpgaBaseHelper< SomeBaseClass, AccessMethod, 1 > helper1;
FpgaBaseHelper< SomeBaseClass, StrangeAccessMethod<MyDevice>, 2> helper2;
FpgaBaseHelper< SomeBaseClass, uint32_t, 3 > helper3;
然后,结果是为helper1和helper2实例化了主模板,第三个实例化了uint32_t专门化。
我需要helper2才能使用StrangeAccessMethod<>专业化
我做错了什么?
符号:
template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
}
不正确。它指的是未在主模板中定义的嵌套模板。最有可能的是,编译器并没有像在许多其他情况下使用模板那样说任何话。
多个模板头只能在以下情况下使用:
template<typename BASE, int MODULE> struct BaseHelper
{
template<typename DEVICE> struct InnerTemplate; // This is forward declaration.
}
template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper<BASE, MODULE>::InnerTemplate
{
// Definition.
}
你可以试试:
template<typename BASE, int MODULE, typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
}
也许它会起作用。
相关文章:
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 为什么依赖模板类型在部分专用化中不可推导?
- 具有可变参数非类型参数的模板专用化
- 检查子类型时的专用方法模板
- 特定类型的模板函数的专用化
- 将"模板<类型名 T>zero()"扩展/专用为可调用的"T"
- 模板专用化和明确指定返回类型与自动
- 将返回类型专用化为 void 或 const 左值引用
- 专用于类型集的函数模板
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 具有模板专用化的泛型类型转换
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 具有不同非类型模板参数的模板类部分专用化
- 从具有部分专用化的boost:hana::set中提取类型失败
- 带有void类型和参数的C++11模板专用化
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 如何为模板的内部类型专用化类
- 编译时的类型专用化