这个问题已经在这里有一个答案:
- 模板函数内部的静态变量 7个回答
据我所知,每个模板都有每个翻译单元在不同的情况下,为我的理解翻译单元大致为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。
那么,有什么问题?
- 是我的模板和翻译单位的理解错了吗? 要么...
- 我做错了这个测试代码?