模板类自动注册,VS2017编译器删除静态成员 我对VS 2017社区C++编译器有问题。 它从模板类中删除静态成员。在VS 2013中一切正常

模板类自动注册,VS2017编译器删除静态成员 我对VS 2017社区C++编译器有问题。 它从模板类中删除静态成员。在VS 2013中一切正常,c++,templates,visual-studio-2017,C++,Templates,Visual Studio 2017,我想向类添加静态成员。创建该成员将注册类(将其添加到链接列表)。我还希望它与模板类一起工作。 在下面的代码中,我有4个类:C1、C2、C2、C3。在VS2013中,所有4个类都已注册,但在VS2017中,C2未注册,C2仅注册,因为我在printf调用中使用了该静态成员。 有没有办法告诉编译器,这个静态成员不应该被“优化” struct是{ 是下一个; 静态是第一位的; 虚拟void CallStaticFoo()=0; iS(){next=first;first=this;} 静态void C

我想向类添加静态成员。创建该成员将注册类(将其添加到链接列表)。我还希望它与模板类一起工作。 在下面的代码中,我有4个类:C1、C2、C2、C3。在VS2013中,所有4个类都已注册,但在VS2017中,C2未注册,C2仅注册,因为我在printf调用中使用了该静态成员。 有没有办法告诉编译器,这个静态成员不应该被“优化”

struct是{
是下一个;
静态是第一位的;
虚拟void CallStaticFoo()=0;
iS(){next=first;first=this;}
静态void CallAllFoo()
{
用于(自动f=first;f;f=f->next)
f->CallStaticFoo();
}
};
iS*iS::first=nullptr;
模板结构S:public是{
void CallStaticFoo(){T::StaticFoo();}
};
C1类{
公众:
静态void StaticFoo(){printf(“[C1:%llx]\n”,重新解释强制转换(s.next));}
私人:
静态S;
};
sc1:S;
模板类C2{
公众:
tx;
静态void StaticFoo(){printf(“[C2:%llx]\n”,重新解释强制转换(s.next));}
//私人:
静态S;//“S”将是私有成员
};
模板S C2::S;
C3类{
公众:
静态void StaticFoo(){printf(“[C3:%llx]\n”,重新解释强制转换(s.next));}
私人:
静态S;
};
sC3::S;
int main()
{
C1;
C2_1;
C2_2;
c2_1.x=1;
c2_2.x=3;
自动y=c2_2.x-c2_1.x;
printf(“[%d]\n”,y);
iS::CallAllFoo();
//***问题:如果我注释行be;;pw,C2未注册。
//编译器将删除静态成员*s*。
printf(“--%llx\n”,重新解释演员阵容(c2_1.s.next));
//printf(“--%llx\n”,重新解释演员阵容(c2.s.next));
返回0;
}
课程描述: 是-链表条目。它用于为每个注册的类调用StaticFoo。为此,它有静态方法CallAllFoo。 S-用作类的静态成员。它将类添加到链表中。 C1-以S为静态成员的正常类。这门课的注册总是有效的。 C2-模板类。注册仅在VS2013中有效,或者如果我在代码中使用静态成员。 C3-与C1相同,但未使用。仍然可以进行注册。

您需要按照以下方式注册所有类型:

template class C2<int>;
template class C2<long>;
模板类C2;
模板类别C2;
否则,编译器将不会从您不使用的模板中创建类及其相应的静态变量。为什么要为您不使用的东西付费,以及编译器如何知道应该使用哪些类型从您的模板中创建类

在这里,您可以看到没有为行
模板S C2::S生成代码
如果您对explicit实例化和调用
c2_1.s.next
(第58、59和54行)进行注释

VisualStudioC++编译器获得了更高的标准符合性。

template class C2<int>;
template class C2<long>;