使用多个类型名称时未选择模板类型的模板专业化

发布于 2024-10-10 21:06:41 字数 777 浏览 2 评论 0 原文

假设我

template <typename T>
class F;

可以创建另一个模板,该模板采用 F 作为类型,具有默认值和专门化。

template <typename S>
class G;

template <>
template <typename T>
class G <F<T> >
{
};

我可以实例化 G > g_of_f。编译器正确选择了 G 的特化,一切都很好。

所以这是我的问题。我想使用列表中的多个模板类型名来执行此操作。但是当我

template <typename U, typename S>
class H;

template <typename U>
template <typename T>
class H <U, F<T> >
{
};

现在尝试时,我无法实例化 H; > h_of_f,因为编译器选择原始模板 H 而不是特化。

我在 g++ 4.1 和 g++ 4.4 中观察到了相同的行为。

GH 之间有什么区别,导致编译器无法按我期望的方式工作?

Let's say I have

template <typename T>
class F;

I can create another template who takes an F as a type, with a default and a specialization.

template <typename S>
class G;

template <>
template <typename T>
class G <F<T> >
{
};

I can instantiate G<F<int> > g_of_f. The compiler correctly selects the specialization of G, and everything is great.

So here's my problem. I want to do this with more than one template typename in the list. But when I try

template <typename U, typename S>
class H;

template <typename U>
template <typename T>
class H <U, F<T> >
{
};

now I cannot instantiate H<void, F<int> > h_of_f, because the compiler is selecting the original template H and not the specialization.

I've observed the same behavior with g++ 4.1 and g++ 4.4.

What is the difference between G and H that's preventing the compiler from working the way I'm expecting?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执手闯天涯 2024-10-17 21:06:44
template <typename U, typename S>
class H;

template <typename U, typename T>
class H <U, F<T> > {};

此语法:

template <> template <typename U>

用于在模板之外专门化/定义模板成员:
http://www.comeaucomputing.com/techtalk/templates/#outsidedef

template <typename U, typename S>
class H;

template <typename U, typename T>
class H <U, F<T> > {};

This syntax:

template <> template <typename U>

is for specializing/defining template members outside of template:
http://www.comeaucomputing.com/techtalk/templates/#outsidedef

很糊涂小朋友 2024-10-17 21:06:43

template<> 语法用于引入显式特化声明,这里有部分特化:

template <typename S>
class G;

template <typename S>
class G < F<S> >
{
};

template <typename U, typename S>
class H;

template <typename U, typename S>
class H <U, F<S> >
{
};

The template<> syntax is used to introduce an explicit specialization declaration, what you have here are partial specializations :

template <typename S>
class G;

template <typename S>
class G < F<S> >
{
};

template <typename U, typename S>
class H;

template <typename U, typename S>
class H <U, F<S> >
{
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文