C++ C++;模板-几个专门化-是否定义了行为?
假设我声明了一个模板结构:C++ C++;模板-几个专门化-是否定义了行为?,c++,templates,template-specialization,C++,Templates,Template Specialization,假设我声明了一个模板结构: template <int N> struct mystruct; 我还可以通过以下方式说明一般行为: template<int N> struct mystruct {float k = 3.14;}; template struct mystruct{float k=3.14;}; 如果我在main中运行: struct mystruct<-1> x; struct mystruct<0> y; struct
template <int N> struct mystruct;
我还可以通过以下方式说明一般行为:
template<int N> struct mystruct {float k = 3.14;};
template struct mystruct{float k=3.14;};
如果我在main中运行:
struct mystruct<-1> x;
struct mystruct<0> y;
struct mystruct<1> z;
std::cout << x.k << " " << y.k << " " << z.k << std::endl;
struct mystruct x;
结构我的结构;
结构mystruct z;
std::cout对于您的特定情况,因为专门化必须出现在主模板之后,并且假设它们都出现,那么是的。否则,如果一个TU看到了专门化,而另一个TU没有,并且它们都使用mystruct
,那么您将得到未定义的行为
在一般情况下,有很多专业化可能相当复杂,C++标准就有这样的说法,强调矿山:
函数显式专门化声明的放置
模板、类模板、变量模板、的成员函数
类模板,类模板的静态数据成员,成员
类模板的类,类模板的成员枚举,
类模板、成员函数模板的成员类模板
类模板的静态数据成员模板,
类模板的成员模板的成员函数,成员
非模板类的成员模板功能,静态数据
非模板类的成员模板,非模板类的成员函数模板
类模板的成员类等,以及部分
类模板、变量模板的专门化声明,
非模板类的成员类模板,静态数据成员
非模板类的模板,类的成员类模板
模板等会影响程序的格式是否正确
对显性专业化的相对定位
翻译单元中的声明及其实例化点
如上文和下文所述编写专门化时,请注意
注意它的位置;或者让它编译起来就是这样一种尝试
点燃了它的自焚之火。
C++规范化确保模板专业化<代码> <代码>覆盖一般构造<代码> <代码>,无论代码中的模板专业化顺序是什么?
只是澄清一下术语
template<int N> struct mystruct {float k = 3.14;};
template struct mystruct{float k=3.14;};
这不是一种专门化。它是主/通用/基本实现
只要在使用点mystruct
处可以看到专门化,只要使用了mystruct
,就可以使用专门化mystruct
。这就是专业化的全部要点。简短回答:是的,这就是专业化的全部要点。这里只有一个专业化,mystruct
。另一个变体只是一个主模板本身,只要它能看到,就可以保证。您可以在非常真实的情况下使用一些主模板,一个专门用于某个类型Foo
的头,然后这个主模板的某个客户机不知何故不包括执行专门化行为的头。如果主要和专门化都在一个标题中,这是不可能发生的,但是当模板专门化用作库的自定义点时,经常会出现这种情况。这类事情需要用户的思考、仔细的设计和文档。粗体字体会破坏复活节彩蛋。@PeteBecker好吧,阅读所有不同模板类型的列表是相当令人畏惧的(我过了一段时间才停止计算“模板”的外观…)。我不想让OP错过重点。是的,这是一段精彩的引语。我渴望有一天能用它来回答问题。在“C++列表中,不必期望看到幽默”:那么,在我的例子中,什么可能会导致未定义的行为?@本杰明巴罗伊斯——在你的例子中,如果一个翻译单位看到了专门化,而第二个翻译单位没有看到,他们都会使用模板mystruct
。就在那里。
template<int N> struct mystruct {float k = 3.14;};