在不同的翻译单元模板实例[复制](Template instance in different tr

2019-10-22 11:17发布

这个问题已经在这里有一个答案:

  • 模板函数内部的静态变量 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.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。

那么,有什么问题?

  • 是我的模板和翻译单位的理解错了吗? 要么...
  • 我做错了这个测试代码?

Answer 1:

是我的模板和翻译单位的理解错了吗?

是。 这是不对的。
按类型不是创建每个翻译单元模板函数的副本。

在您的情况下,用于test<int>创建仅1拷贝和相同在所有TU的使用。



文章来源: Template instance in different translation units [duplicate]