在C++中是正确的吗

在C++中是正确的吗,c++,static-members,C++,Static Members,如果我在头文件中有以下代码,它是否正确 template <T> Stopwatch *Stopwatch::m_instance = nullptr; class Stopwatch { std::clock_t m_lastStep; std::clock_t m_start; static Stopwatch *m_instance; }; 好的,在大家的帮助下,我可以将其编译如下: 其思想是将类定义和静态成员初始化放在一个头文件上。请注意,我使用模板,

如果我在头文件中有以下代码,它是否正确

template <T> Stopwatch *Stopwatch::m_instance = nullptr;
class Stopwatch
{
   std::clock_t m_lastStep;
   std::clock_t m_start;
   static Stopwatch *m_instance; 

};
好的,在大家的帮助下,我可以将其编译如下:

其思想是将类定义和静态成员初始化放在一个头文件上。请注意,我使用模板,但从未使用其类型

为了简单起见,我删除了代码的其他部分

template <typename T>
class Stopwatch
{
   std::clock_t m_lastStep;
   std::clock_t m_start;
   static Stopwatch *m_instance; 

};

template <typename T>
Stopwatch<T> *Stopwatch<T>::m_instance = nullptr;

现在我需要看看它是否真的有效

为什么不编译它来查看?顺便说一句,代码不会编译

您必须在类定义之后移动第一行

另外,您将m_实例定义为两种不同的符号。您必须删除多余的模板说明符,或者在类定义中将m_实例成员变量声明为模板变量

如果决定将其保留为模板变量,则模板参数T仍然缺少类型。在其前面添加typename或class以修复此问题


然后它将编译。

修复了类定义应该首先执行的问题,这是正确的,只要您只在一个*.cpp文件中包含此头文件

在头文件中实现静态字段意味着:可能会将其包含在多个*.cpp文件中:不可能。您甚至不能将其声明为静态


我猜原因是C++中可以通过函数调用的结果初始化变量,因此,这将带来一个风险,即一个对象被双重初始化并导致未定义的行为,因为理论上它可能会经历模糊的链接。

否。为什么不尝试编译它?为了简单起见,我删除了代码的其他部分,那么我们如何知道您删除的代码部分是否是必需的?@mans我们到底应该做什么?哦没关系,在每个VC++开发者的生命中都有一个时间,当他们关闭智能感知时,因为它不起作用。这就是我使用模板的原因,因为模板可以在头文件中定义。没有“模板可以在头文件中定义”这样的规则-在头文件中只能定义这样的东西,而不是物理类、整数常量、,或者-如果是-它们要么不执行链接静态函数或变量,要么执行模糊的链接内联函数,这可能会导致离线版本,或者各种C++生成的对象,如虚拟表或RTTI对象。模板的特殊之处在于它们必须在头文件中定义—不导出,也就是说,它必须是一个类或内联函数—tpl不能有任何其他功能