C++ 如何在模板类中初始化此静态类变量?

C++ 如何在模板类中初始化此静态类变量?,c++,c++03,C++,C++03,我有以下代码(): 模板 类CMemoryPool { 公众: CMemoryPool(int参数1) :stuff(参数1) {} 私人: T类物质; }; 模板 类CList { 公众: 结构条目 { T数据; }; 静态CMemoryPool s_池; }; 模板 CList::CMemoryPool::s_pool(1); int main() { CList列表; } 我似乎无法将s_pool的初始化置于要编译的类之外。有人能帮我弄明白怎么做吗?注意:我只使用C++03。编辑: 我的

我有以下代码():

模板
类CMemoryPool
{
公众:
CMemoryPool(int参数1)
:stuff(参数1)
{}
私人:
T类物质;
};
模板
类CList
{
公众:
结构条目
{
T数据;
};
静态CMemoryPool s_池;
};
模板
CList::CMemoryPool::s_pool(1);
int main()
{
CList列表;
}
我似乎无法将
s_pool
的初始化置于要编译的类之外。有人能帮我弄明白怎么做吗?注意:我只使用C++03。

编辑: 我的印象是:

对于模板的每个实例化,必须显式地为静态值赋值:

CList<int>::CMemoryPool<CList<int>::Entry>::s_pool(1);
CList::CMemoryPool::s_pool(1);
必须在*.C文件中的某个位置

或者,在用于获取值的表的方法中使用静态局部变量

但播放一段时间后,这似乎是用ideone编译的

template<class T>
CMemoryPool<typename CList<T>::Entry> CList<T>::s_pool(1);
模板
CMemoryPool CList::s_pool(1);
我仍然推荐@FredOverflow解决方案,因为它可以保护您免受编辑: 我的印象是:

对于模板的每个实例化,必须显式地为静态值赋值:

CList<int>::CMemoryPool<CList<int>::Entry>::s_pool(1);
CList::CMemoryPool::s_pool(1);
必须在*.C文件中的某个位置

或者,在用于获取值的表的方法中使用静态局部变量

但播放一段时间后,这似乎是用ideone编译的

template<class T>
CMemoryPool<typename CList<T>::Entry> CList<T>::s_pool(1);
模板
CMemoryPool CList::s_pool(1);

我仍然推荐@FredOverflow解决方案,因为它可以保护您的类模板中的静态数据成员不受影响,初始化时有些麻烦。我建议改为使用工厂函数。那么您就不必担心在其他地方定义变量了

重写这句话就行了

static CMemoryPool<Entry> s_pool;
静态CMemoryPool s_pool;

staticcmemorypool&s_pool()
{
静态CMemoryPool foobar;
返回foobar;
}

然后到处使用
s\u pool()
而不是
s\u pool
。惰性初始化是一个好处。

初始化类模板中的静态数据成员有些困难。我建议改为使用工厂函数。那么您就不必担心在其他地方定义变量了

重写这句话就行了

static CMemoryPool<Entry> s_pool;
静态CMemoryPool s_pool;

staticcmemorypool&s_pool()
{
静态CMemoryPool foobar;
返回foobar;
}

然后到处使用
s\u pool()
而不是
s\u pool
。您可以获得延迟初始化的好处。

我认为您忘记了初始化静态数据成员通常是如何工作的:

struct Data { int i; };

struct Holder { static Data StaticMember; };

Data Holder::StaticMember = { 1 };
^    ^~~~~~~~~~~~~~~~~~~~ static member qualified name
\~~~ static member type
如果你看一下你的声明,令人惊讶的是你忘记了上面两项中的一项:

// Only a single element: there should be a type and a name
template<class T>
CList<T>::template CMemoryPool<typename CList<T>::Entry>::s_pool(1);

// Two elements
template<class T>
CMemoryPool<typename CList<T>::Entry> CList<T>::s_pool(1);
^                                     ^~~~~~~~~~~~~~~~ name
 \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ type
//只有一个元素:应该有一个类型和名称
模板
CList::template CMemoryPool::s_pool(1);
//两个要素
模板
CMemoryPool CList::s_pool(1);
^^~~~~~~~~~~~~~~~~~~~姓名
\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类型

更正后

我认为您忘记了初始化静态数据成员通常是如何工作的:

struct Data { int i; };

struct Holder { static Data StaticMember; };

Data Holder::StaticMember = { 1 };
^    ^~~~~~~~~~~~~~~~~~~~ static member qualified name
\~~~ static member type
如果你看一下你的声明,令人惊讶的是你忘记了上面两项中的一项:

// Only a single element: there should be a type and a name
template<class T>
CList<T>::template CMemoryPool<typename CList<T>::Entry>::s_pool(1);

// Two elements
template<class T>
CMemoryPool<typename CList<T>::Entry> CList<T>::s_pool(1);
^                                     ^~~~~~~~~~~~~~~~ name
 \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ type
//只有一个元素:应该有一个类型和名称
模板
CList::template CMemoryPool::s_pool(1);
//两个要素
模板
CMemoryPool CList::s_pool(1);
^^~~~~~~~~~~~~~~~~~~~姓名
\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类型


更正后

这一问题已被多次询问:-这是针对模板类的,您指向简单场景的链接没有回答我的问题,只需使用tprety的模板类型。请确保您需要
CList::Entry
typename
,但不幸的是:(…这已经被问了很多次:-这是一个模板类,您指向简单场景的链接不能回答我的问题,只需使用tprety的模板类型。请确定您需要
typename
作为
CList::Entry
,但不幸的是:(…大多数其他模板静态可以用类型
T
初始化,那么在这种情况下,为什么我需要为每个类型显式地进行初始化呢?啊,我现在觉得很愚蠢!静态初始化语句缺少它的类型!做得很好!@RobertDailey…但是…我不确定在其*.h文件上正确定义此模板时,这将如何发挥作用d包含在多个位置…有人知道吗?大多数其他模板静态可以用类型
T
初始化,那么为什么在这种情况下我需要为每个类型显式地进行初始化?啊,我现在觉得很愚蠢!静态初始化语句缺少它的类型!干得好!@RobertDailey…但是…我不确定当这个模板te在其*.h文件中正确定义,并包含在多个位置…有人知道吗?没有回答我的问题question@FredOverflow可能您缺少了将替换原来的
CList::CMemoryPool::s_pool(1)的
静态CMemoryPool foobar(1);
@RobertDailey我一直在玩弄你的代码,但语法不正确。我会说Freds answer很好地回答了你的问题,或者最好说:优雅地解决你的问题。我不是在寻找优雅的解决方案,这对我来说是一个实验(学习练习)。我发现了这个问题,但无法解决它,如果能找到解决方案,那将是一件很好的事情。我知道有其他方法可以做同样的事情,但这不是我想要的。不回答我的问题question@FredOverflow可能您缺少了将替换原来的
CList::CMemoryPool::s_pool(1)的
静态CMemoryPool foobar(1);
@RobertDailey我一直在玩弄你的代码,但语法不正确。我会说Freds answer很好地回答了你的问题,或者最好说:优雅地解决了你的问题。我不想