This question already has answers here:
Static variable inside template function
(7个答案)
5年前关闭。
据我所知,每个模板在每个翻译单元上都有不同的实例,据我所知,翻译单元大致是一个
因此,如果我有一个名为
对于每个翻译单元,即使模板参数
如我们所见,
我期待
那是什么问题呢?
我对模板和翻译单元的理解错误吗?或者... 我的测试代码有问题吗?
(7个答案)
5年前关闭。
据我所知,每个模板在每个翻译单元上都有不同的实例,据我所知,翻译单元大致是一个
cpp
文件。因此,如果我有一个名为
test.hpp
的文件,其内容如下:// test.hpp
template <typename T> void test()
{
static T t = T(0);
return t++;
}
对于每个翻译单元,即使模板参数
test
在每个模板中都相同,我也应该拥有一个不同的T
实例。我决定对其进行测试,因此我创建了以下文件(为简洁起见,省略了包含卫兵):// a.hpp
namespace A { void f(); }
// a.cpp
#include <iostream>
#include "a.hpp"
#include "test.hpp"
namespace A
{
void f() { std::cout << test<int>(); }
}
// b.hpp
namespace B { void f(); }
// b.cpp
#include <iostream>
#include "b.hpp"
#include "test.hpp"
namespace B
{
void f() { std::cout << test<int>(); }
}
如我们所见,
a.cpp
和b.cpp
都使用int
模板的test()
实例,但是使用不同的翻译单元,因此执行以下程序:// main.cpp
#include "a.hpp"
#include "b.hpp"
int main()
{
A::f();
B::f();
return 0;
}
我期待
00
的输出,但我却得到01
。我用来测试此代码的IDE是MSVC2010 V10.0.4 SP1。那是什么问题呢?
最佳答案
是。这是错的。
模板函数的副本是按类型和类型(而不是按翻译单位类型)创建的。
对于您的情况,对于test<int>
仅创建1个副本,并且所有TU都使用相同的副本。
关于c++ - 不同翻译单元中的模板实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29367350/
10-11 16:12