c++-C++ 类模板的静态私有内部类如何初始化?

问题描述

C++ 类模板的静态私有内部类如何初始化?

搞了一个通宵了,百度过很多资料,始终解决不了这个问题。令我开始对C++的繁琐感到厌倦了。为了编译通过这么一个小问题,折腾这么长时间,真心觉得这种语言繁琐,刻板,效率低,过时了,让我这个6年的C++粉开始有点失望……

 #ifndef __SINGLETON__H__
#define __SINGLETON__H__

template <typename T>
class Singleton
{
public:

    static T* GetInstance()
    {
        return m_pInstance;
    }

protected:

    Singleton() {}
    ~Singleton() {}

private:

    Singleton(const Singleton<T> &);
    Singleton& operator = (const Singleton<T> &);

    static T* m_pInstance;

    class Worker  // 这里在类模板中定义了一个内部类
    {
    public:

        Worker()
        {
            i = 0;
            if ( !m_pInstance )
            {m_pInstance = new T();printf("ccc
");}

        }

        ~Worker()
        {

            if ( m_pInstance )
            {delete m_pInstance;printf("ddd
");}

        }
        int i;
    };

    static Worker worker;  // 静态内部类成员,私有的。为了在类模板实例创建时自动调用此静态内部类的构造函数,销毁时自动调用此静态内部类的析构函数
};

template <typename T> T* Singleton<T>::m_pInstance = NULL;  // 这句编译通过
template <typename T> Singleton<T>::Worker Singleton<T>::worker;  // 就是这句编译不通过,纠结了一晚上了,浪费了许多时间,不知道该怎么写,求大神们指教。

#define SINGLETON_INIT(Type) friend Type* Singleton<Type>::GetInstance(); private: Type(); ~Type()

#endif

错误输出:
警告 1 warning C4346: “Singleton::Worker”: 依赖名称不是类型
错误 2 error C2143: 语法错误 : 缺少“;”(在“Singleton::worker”的前面)

错误 3 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

解决方案

 template <typename T> Singleton<T>::Worker Singleton<T>::worker;  // 就是这句编译不通过,纠结了一晚上了,浪费了许多时间,不知道该怎么写,求大神们指教。

 加一个typename就能够通过编译,改为:
 template <typename T> typename Singleton<T>::Worker Singleton<T>::worker;

解决方案二:

c++中可以对类中私有成员中的静态变量初始化吗?

解决方案三:

template Singleton::Worker Singleton::worker;不是静态变量;
template Singleton::Worker 又是私有内嵌类型,于是外部界不可见,此定义非法。

解决方案四:

 template <typename T> typename Singleton<T>::Worker Singleton<T>::worker;

解决方案五:

 //protected: 修改为:
public:
    Singleton() {   printf("Singleton 构造。
");    }
    ~Singleton() {  printf("Singleton 析构。 %x
",m_pInstance); }

template <typename T> typename Singleton<T>::Worker Singleton<T>::worker;

解决方案六:

template Singleton::Worker Singleton::worker;不是静态变量;
template Singleton::Worker 又是私有内嵌类型,于是外部界不可见,此定义非法。

时间: 2025-01-20 10:21:59

c++-C++ 类模板的静态私有内部类如何初始化?的相关文章

ios-自定义类系统自带的类模板没有了、怎么办啊!

问题描述 自定义类系统自带的类模板没有了.怎么办啊! 每次新建继承系统的类的文件都是光秃秃的!太不方便了,原来新建都会自带类模板的啊?求解 解决方案 类模板多种类型的类模板自定义类模板,类模板的默认类型数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器 解决方案二: 楼主指的是什么环境什么编辑器 解决方案三: 我觉得你是不是直接选了Objective-C文件,而不是cocoa touch class

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

c++-C++私有内部类静态变量未进行类体外定义

问题描述 C++私有内部类静态变量未进行类体外定义 以下为Singleton.h: class HungerSingleton{private: class CGarbo // 用于析构s_pInstance { public: ~CGarbo() { if(HungerSingleton::s_pInstance) delete HungerSingleton::s_pInstance; } }; static CGarbo Garbo; static HungerSingleton *s_p

如何访问一个类的私有内部类?

问题描述 如何访问一个类的私有内部类? 问题补充:牟盖东 写道 解决方案 通过反射,把它的访问性,强制设为 true,然后 invoke解决方案二:具体问题要具体分析了.你这个实际应用我还真没弄过.不过我想,要么,人家就是不打算让你动:要么,人家提供了其他的方法让你DIY,比如配置文件.API之类的,看看它的文档吧.解决方案三:哦,原来你是想改写之,这个是错误的.人家为什么设计成内部类?还是私有的?一定是有原因的.那你为啥想要改写?问一问自己的设计和思路是不是存在问题吧,我想一定是的.如果只是想

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

C++实践参考:数组类模板

[项目-数组类模板] 在数组类的基础上,将之改造为类模板,以使数组中可以存储各种类型的数据. template <class T> //数组类模板定义 class Array { private: T* list; //用于存放动态分配的数组内存首地址 int size; //数组大小(元素个数) ... }; 参考解答: #include <iostream> #include <iomanip> #include <cassert> using name

ASP.NET MVC使用RazorEngine解析模板生成静态页_实用技巧

简述       Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是ASPX模板引擎,Razor在语法上的确不错,用起来非常方便,简洁的语法与.NET Framework 结合,广泛应用于ASP.NET MVC 项目.       我们在很多项目开发中会常常用到页面静态化,页面静态化有许多方式,最常见的就是类似很多PHP CMS种使用的 标签替换的方式(如:帝国CMS.EcShop等),还有很多都是伪静态,伪静态我们就不做过

静态私有成员初始化重置?

问题描述 情况是这样的,在一个类里有个私有静态成员,也有个静态方法判断它为null则赋值,已赋值过就不赋值了,现在遇到个问题,程序运行过程中已调用这个静态方法,即私有静态成员已不为null,但确实在某些时候我要重新赋值,注意那个静态方法是无参的,没办法将那个私有成员重置回null,有没办法不修改那个方法的逻辑,让私有静态成员初始化为null,就像刚加载程序集还没调用静态方法的时候那样子? 解决方案 解决方案二:再加一个静态方法,让那个静态变量归零,不就行了或者重写静态方法,里面做判断,在XXX条