Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板基类中的静态变量_C++ - Fatal编程技术网

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。我想在静态集中注册类类型。这听起来和我链接的答案完全一样……你读过了吗?