如果我在头文件中有以下代码是否正确?
template <T> Stopwatch *Stopwatch::m_instance = nullptr;
class Stopwatch
{
std::clock_t m_lastStep;
std::clock_t m_start;
static Stopwatch *m_instance;
};
ok在每个人的帮助下,我可以设法编译如下:
这个想法是在一个头文件上进行类定义和静态成员初始化。请注意,我使用模板但从未使用过它的类型。
为简单起见,我删除了其他部分代码。
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;
现在我需要看看它是否真的有效!
答案 0 :(得分:2)
为什么不编译才能看到?顺便说一下,代码无法编译。
您必须在课程定义后移动第一行。
此外,您将m_instance
定义为两种不同的符号。您必须删除冗余模板说明符,或者在类定义中将m_instance
成员变量声明为模板变量。
如果您决定将其保留为模板变量,则模板参数T
仍然缺少类型。在它之前添加typename
或class
来解决此问题。
然后它将编译。
答案 1 :(得分:0)
如果只修改了一个* .cpp文件,那么只要将这个头文件包含在一个* .cpp文件中,就可以先修改类定义,这是正确的。
在头文件中实现静态字段(意思是:您可能会将其包含在多个* .cpp文件中): NOT POSSIBLE 。你甚至不能将它声明为静态。
我想原因是在C ++中你可能会通过函数调用的结果初始化变量,所以这会带来一个对象被双重初始化并导致未定义行为的风险(因为理论上它可能会模糊不清连接)。