C++ 模板基类中的静态变量
这不打印任何内容:C++ 模板基类中的静态变量,c++,C++,这不打印任何内容: #include <iostream> template <typename Derived> struct A { static int test() { std::cout << "test" << std::endl; return 0; } static inline int a = test(); }; struct B : public A<
#include <iostream>
template <typename Derived>
struct A
{
static int test()
{
std::cout << "test" << std::endl;
return 0;
}
static inline int a = test();
};
struct B : public A<B>
{
};
int main(int argc, char** argv)
{
return EXIT_SUCCESS;
}
#包括
模板
结构A
{
静态int测试()
{
std::cout由于A
是一个模板类,静态内联函数/变量实际上不会从模板实例化,除非使用它们。因此,您可以这样做,例如:
#include <iostream>
template <typename Derived>
struct A
{
static int test()
{
std::cout << "test" << std::endl;
return 0;
}
static inline int a = test();
};
struct B : public A<B>
{
static inline int b = a;
};
int main(int argc, char** argv)
{
return 0;
}
#包括
模板
结构A
{
静态int测试()
{
std::cout由于A
是一个模板类,静态内联函数/变量实际上不会从模板实例化,除非使用它们。因此,您可以这样做,例如:
#include <iostream>
template <typename Derived>
struct A
{
static int test()
{
std::cout << "test" << std::endl;
return 0;
}
static inline int a = test();
};
struct B : public A<B>
{
static inline int b = a;
};
int main(int argc, char** argv)
{
return 0;
}
#包括
模板
结构A
{
静态int测试()
{
std::cout第一个代码段没有打印任何内容的原因是静态变量没有实例化。必须使用该变量才能实例化它
类模板专门化的隐式实例化会导致
声明的隐式实例化,而不是
类的定义、默认参数或noexcept说明符
成员函数、成员类、作用域成员枚举、静态
数据成员、成员模板和好友
作为解决方法,您可以只使用该变量:
int main(int argc, char** argv)
{
(void) B::a;
return EXIT_SUCCESS;
}
第一个代码段没有打印任何内容的原因是静态变量没有实例化。必须使用该变量才能实例化它
类模板专门化的隐式实例化会导致
声明的隐式实例化,而不是
类的定义、默认参数或noexcept说明符
成员函数、成员类、作用域成员枚举、静态
数据成员、成员模板和好友
作为解决方法,您可以只使用该变量:
int main(int argc, char** argv)
{
(void) B::a;
return EXIT_SUCCESS;
}
如前所述,(自动)解决方案是创建一个使用注册变量的构造函数。此外,只有在构造对象时才会初始化该变量
#include <iostream>
template <typename Derived>
struct A
{
A()
{
a = 0;
}
static int test()
{
std::cout << "test" << std::endl;
return 0;
}
static inline int a = test();
};
struct B : public A<B>
{
};
int main(int argc, char** argv)
{
B b;
return EXIT_SUCCESS;
}
#包括
模板
结构A
{
()
{
a=0;
}
静态int测试()
{
正如所指出的,(自动)解决方案是创建一个使用注册变量的构造函数。此外,只有在构造对象时才会初始化变量
#include <iostream>
template <typename Derived>
struct A
{
A()
{
a = 0;
}
static int test()
{
std::cout << "test" << std::endl;
return 0;
}
static inline int a = test();
};
struct B : public A<B>
{
};
int main(int argc, char** argv)
{
B b;
return EXIT_SUCCESS;
}
#包括
模板
结构A
{
()
{
a=0;
}
静态int测试()
{
std::cout第二个有什么问题?@user463035818可能是您必须在每个派生类中编写它。@MaxLanghof如果test
放在一个(非模板化的)基类中,那么它就没有问题?@user463035818可能是您必须在每个派生类中编写它。@MaxLanghof如果test
放在一个基类中,那么它就没有问题(非模板)base clasYeah隐式问题是为什么变量没有初始化。其思想是避免任何其他代码,以便自动为每个派生类执行静态函数。是的,隐式问题是为什么变量没有初始化。其思想是避免任何其他代码,以便为每个派生类aut执行静态函数omatically。这个想法是自动的。@chila那么为什么不使用这样的答案呢?所有从模板类继承的类都应该在程序启动时注册,然后再执行main。我想在一个静态集中注册类类型。这听起来和我链接的答案一模一样……你读过了吗?这个想法是自动的。@chila那么你不使用这样的答案吗?对于从模板类继承的所有类,注册应该在程序启动时进行,然后再执行main。我想在静态集中注册类类型。这听起来和我链接的答案完全一样……你读过了吗?