Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板-几个专门化-是否定义了行为?_C++_Templates_Template Specialization - Fatal编程技术网

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;};