这在c++中正确吗
Is this correct in c++
如果我在头文件中有以下代码,那么它是否正确?
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
仍然缺少一个类型。在它之前添加typename
或class
以修复此问题。
然后它将编译。
修复了类定义应该优先的问题,只要您只在一个*.cpp文件中包含此头文件,这是正确的。
在头文件中实现静态字段(意味着:您可能会将其包含在多个*.cpp文件中):不可能。您甚至不能将其声明为静态。
我想原因是在C++中,你可以通过函数调用的结果来初始化变量,所以这会带来对象被双重初始化并导致未定义行为的风险(因为理论上它可能会经历模糊的链接)。
相关文章:
- 以相反的顺序打印数组 - 为什么这在C++中是错误的?
- 这在 C++ 类和对象中指向此指针
- 这在C++是什么类型的错误?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 为什么这在 c++ 中不起作用,但在 python 中工作
- 这->...在模板包装类中必需
- 这"在比赛中为m,n"做什么?
- 这在技术上可能是可能的
- 这在 C# 中意味着什么以及如何使用它
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 是返回*这在 C++ 中是安全的
- 通过值或通过引用返回类对象,这在这里会更快
- 这在 C++ 中是如何工作的,并且在 JavaScript 中有任何粗略的等价物?
- 在插入时同时迭代一个映射,这在什么方面是不安全的
- 模板中的友元函数(为什么这在Visual Studio中失败,而不是GCC和Clang)
- 这在C++中不正确吗?
- 返回指针、返回值或传入引用,这在C++中很优雅
- 这在Visual Studio中是否被视为.NET或IL
- 这在 C 语言中是什么意思
- 为什么这在 c++ 中返回零