gpt4 book ai didi

c++ - 类模板的非类、非函数成员的显式特化

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:46 25 4
gpt4 key购买 nike

看代码:

template <class x> struct Foo
{
int getX(x *p) { return(0); }
enum E12 { a };
};

template <> int Foo<int>::getX(int*)
{
return(-15);
}

template <> enum Foo<int>::E12
{
a, b, c
}

正如在 Cannot overload function 中讨论的那样,第一个特化是合法的,甚至可以在 MSVC 中工作。 enum 的第二个特化甚至不想编译,说“错误 C2988:无法识别的模板声明/定义”。

在我看来,C++ 正在为方法创建相对不合逻辑的异常。枚举只是一个例子。同样的事情可以应用于成员类、typedef 等。

如果有人对此发表评论,我会很高兴。

最佳答案

这是 C++11 的一个非常晦涩的新特性。向 Microsoft 提交错误报告,尽管它不太可能被优先考虑,因为几乎没有人知道这是允许的。正确的语法是

template <class x> struct Foo
{
int getX(x *p) { return(0); }
enum E12 { a };
};

template <> int Foo<int>::getX(int*)
{
return(-15);
}

template <> enum Foo<int>::E12
{
a, b, c
};

我已经 filed a bug与海湾合作委员会。有人可以测试最近的 Clang 吗?


在 C++03 中,只有类和函数可以显式特化。从标准 C++03 14.7.3/1 开始:

An explicit specialization of any of the following:

  • function template
  • class template
  • member function of a class template
  • static data member of a class template
  • member class of a class template
  • member class template of a class or class template
  • member function template of a class or class template

can be declared by a declaration introduced by template<>

成员枚举不是这种情况。 (一般来说,一个 enum 类型在它的第一个声明中总是只定义一次。)

获取模板化的enumtypedef ,您可以将其包装在类模板中。在您的情况下,它将是 Foo 的成员类模板.这样的构造称为元函数。

C++11 也有别名模板,类似于模板化的 typedef,但它们不能显式特化。


只允许特殊类和函数的策略,然后允许此类模板封装其他东西,如 enumtypedef ,对我来说似乎比允许直接特化 enum 更一致.但是,也许语言正朝着您喜欢的方向发展。

关于c++ - 类模板的非类、非函数成员的显式特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11271553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com