这在c++中正确吗

Is this correct in c++

本文关键字:c++ 这在      更新时间:2023-10-16

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

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_instance定义为两种不同类型的符号。必须删除冗余模板说明符,或者在类定义中将m_instance成员变量声明为模板变量。

  • 如果您决定将其保留为模板变量,那么您的模板参数T仍然缺少一个类型。在它之前添加typenameclass以修复此问题。

然后它将编译。

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

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

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