gpt4 book ai didi

c++ - C++模板类中的静态字段初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:30 25 4
gpt4 key购买 nike

我正在尝试用 C++ 创建一些自注册类。所以我尝试了类似于提供的解决方案 here .在执行此操作时,我偶然发现了一些奇怪的事情。

代码如下:

#include <iostream>

class StaticClassType {
public:
StaticClassType() {
// Notify when the static member is created
std::cout << "We're in." << std::endl;
}
};


template<typename T>
class TestClass1 {
public:
TestClass1() { &m; }
private:
// Static member in a template class
static StaticClassType m;
};

template<typename T>
StaticClassType TestClass1<T>::m;


class TestClass2 : public TestClass1<TestClass2> {
public:
TestClass2() { } // required; why?
};


int main() {
return 0;
}

此代码在启动时创建静态成员变量 TestClass1::m(从而在控制台打印“We're in.”)——即在 main() 之前开始了。但是,只有当我为 TestClass2 编写(空)构造函数时,代码才有效(如示例所示)。

为什么要写这个构造函数?为什么编译器生成的默认构造函数不做同样的事情?

此问题仅发生在模板类中。如果 TestClass1 不是模板类,则代码无需为 TestClass2 编写空构造函数即可运行。

最佳答案

我创建了更小的示例(没有不需要的构造函数):

#include <iostream>

class StaticClassType {
public:
StaticClassType(int v) {
// Notify when the static member is created
std::cout << "We're in."<<v << std::endl;
}
};


template<typename T>
class TestClass1 {
protected:
// Static member in a template class
static StaticClassType m;
};

template<typename T>
StaticClassType TestClass1<T>::m = StaticClassType(3);


class TestClass2 : public TestClass1<TestClass2> {
public:
void foo()
{
(void)m;
}
};

int main() {
std::cout << "main" << std::endl;
}

请注意需要 foo() 方法,否则编译器会删除静态变量,因为它未在任何地方使用。

关于c++ - C++模板类中的静态字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com