1

我有个问题:

我想明确地实例化一个类Datatype,如:

using Layout = some::namespaces::Meat_Layout<Some,Parameters>;
using Datatype = other::namespaces::Meta_Datatype<Layout>;

对于显式实例化,我需要使用详细的类型说明符。其中不允许使用 typedef。因此我不能写:

template class Datatype;

但我必须写:

template class some::namespaces::Meta_Datatype<other::namespaces::Meat_Layout<Some,Parameters>>;

如果那里还剩下任何 typedef,我也必须替换它们,这可能会导致类似:

template class some::namespaces::Meta_Datatype<other::namespaces::Meta_Meat_Layout<Some,Meta_Parameters<int>,int,int>>;

如您所见,这变得非常不清楚。

有什么技巧可以避免所有类型定义的解构吗?

如果在使用时也可以使用技巧,那将是最好的extern template

4

2 回答 2

1

您不必解构所有类型定义。那些用作模板参数的可以保持原样:

using Layout = some::namespaces::Meat_Layout<Some,Parameters>;
using Datatype = other::namespaces::Meta_Datatype<Layout>;

template class other::namespaces::Meta_Datatype<Layout>;
于 2019-11-07T09:38:20.350 回答
1

实际上,您不需要解构所有类型定义。确实不能将 typedef 用作显式实例化的模板,但可以将 typedef 用作模板的参数,就像 Evg 之前所说的那样。

正如你已经提到的:

14.7.2 显式实例化[temp.explicit]:如果显式实例化是针对类或成员类的,elaborated-type-specifier则声明中应包含simple-template-id.

但是标准中没有提到对模板参数的任何限制,因此您可以自由地在显式实例化中使用任何参数,包括 typedef。

于 2019-11-07T09:48:54.563 回答