【发布时间】:2016-07-29 06:24:58
【问题描述】:
我有一个模板结构SFoo,其中包含一个成员结构SZug:
template <typename tTYPE>
struct SFoo
{
struct SZug {};
};
我有另一个结构体SBar,它带有一个类型参数:
template <typename tTYPE>
struct SBar
{ /* stuff */ };
我想将SBar 专门用于类型参数,使用SZug,如下所示:
template <typename tTYPE>
struct SBar<typename SFoo<tTYPE>::SZug>
{ /* different stuff */ };
这无法编译 - LLVM 输出:
不可演绎的模板参数'tTYPE'
虽然编译器可以根据需要轻松推断出这一点,但我猜只是 C++ 规范需要专门涵盖这种情况。
有什么办法可以做到吗?
(注意:我目前正在通过将SZug 移出SFoo 并使用using 声明来解决它,但这很丑陋。)
【问题讨论】:
-
之后你打算做什么?我不清楚您期望“专业化”做什么。你能告诉我们如何声明一个非特化和特化
SBar的变量吗? -
我实际上将这些纯粹用作特征类型,因此它们从未实际实例化。 Bar 只是为另一个(未提及的)类(加上其他一些东西)提供了一个 constexpr 成员指针。通常需要显式指定成员指针,但对于
SZug特化可以确定。 -- (最终,这与从 1 对 N 通用容器生成 N 对 N 通用嵌入式容器有关 - 成员指针指向用户的容器或节点信息“嵌入”(即成员变量)类型)。 -
我可以稍微修改
SZug来检测它,使用 SFINAE 很容易做你想做的事情(见我的回答)。如果你不能,我不确定有没有办法检测到tTYPE是SFoo<T>::SZug类。
标签: c++ templates partial-specialization