gpt4 book ai didi

c++ - 不同翻译单元中模板类静态变量的显式实例化

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:34 25 4
gpt4 key购买 nike

我正在使用一个包含静态变量的模板类。代码结构如下。

标题.h

template<class T> class Foo
{
public:
static int count;
Foo() {
count++;
}
void printCount() {
cout << count << endl;
}
};
template<class T> int Foo<T>::count;

源代码.cpp

#include "Header.h"
template<> int Foo<int>::count = 5;

main.cpp

#include <iostream>
using namespace std;
#include "Header.h"
int main()
{
Foo<int> obj1;
Foo<int> obj2;
obj1.printCount();
obj2.printCount();
return 0;
}

xcode8.3.3 上的输出是:

 7
7

而 Visual Studio 2015 的输出是:

2
2

即特定实例化会覆盖 xcode8.3.3 中的通用实例化,但不会覆盖 Visual Studio 2015 中的通用实例化。有人可以解释这种行为差异吗?提前致谢。

最佳答案

虽然您的代码包含约束违规,但实际上使其格式正确并维护初始化静态的地方并不太难。对于 C++ 标准,在 [temp.expl.spec]/13 处表示:

An explicit specialization of a static data member of a template or an explicit specialization of a static data member template is a definition if the declaration includes an initializer; otherwise, it is a declaration. [ Note: The definition of a static data member of a template that requires default-initialization must use a braced-init-list:

template<> X Q<int>::x;                         // declaration
template<> X Q<int>::x (); // error: declares a function
template<> X Q<int>::x { }; // definition

 — end note ]

上面的意思是仅仅添加这一行

template<> int Foo<int>::count; // declaration

Header.h 的底部足以让所有翻译单元知道 Foo<int>::count存在于“某处”。一个真正的定义可能保留在 Source.cpp 中。

关于c++ - 不同翻译单元中模板类静态变量的显式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47670775/

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