不同翻译单元中的模板实例

时间:2015-03-31 11:14:40

标签: c++ templates translation-unit

据我所知,每个模板在每个翻译单元上都有不同的实例,据我所知,翻译单元大致是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.cppb.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。

那么问题是什么?

  • 我对模板和翻译单元的理解是错误的吗?或...
  • 我对这个测试代码做错了什么?

1 个答案:

答案 0 :(得分:1)

  

我对模板和翻译单元的理解是错误的吗?

是。这是错的。
模板功能的副本创建每种类型不是每个翻译单元

在您的情况下,对于test<int>,只创建了1个副本,并在所有TU中使用相同的副本。