有多少个模板实例?

时间:2013-12-03 10:19:57

标签: c++ dllimport template-specialization

我已创建Dynamic library项目Foo,并在Foo.h中包含以下代码:

#pragma once
#include <memory>
#ifdef MYLIB_EXPORTS
#define MYLIB_API __declspec(dllexport)
#else
#define MYLIB_API __declspec(dllimport)
#endif

class MYLIB_API Foo
{
};

template class MYLIB_API std::tr1::shared_ptr<Foo>;
typedef std::tr1::shared_ptr<Foo> FooPtr;

我使用Foo中的ConsoleApplication1课程:

#include "stdafx.h"
#include "Foo.h"

template class std::tr1::shared_ptr<Foo>; // (1)

int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
    std::tr1::shared_ptr<Foo>(new Foo()); // (2)
    return 0;
}

上面的代码编译时没有错误/警告。我使用Visual Studio 2008 (v90)工具集来编译它。这两个项目都使用/W4编译。

问题
1.为什么(1)不会产生任何编译器错误/警告?我在这里期待像C2011 type redefinition这样的东西。 我怀疑(1)被忽略。
2. std::tr1::shared_ptr<Foo>有多少个实例?在编译时,我预计会有两个实例化:一个在Foo,另一个在consoleapplication1
3.在(2)中使用了哪个实例(如果有多个)?


UPDATE1:
我使用Assembly With Source Code (/FAs)对其进行了编译,似乎FooConsoleApplication1都包含shared_ptr<Foo>的实现。这是不是意味着有两个shared_ptr<Foo>显式实例化?

1 个答案:

答案 0 :(得分:2)

(1)不是重新定义,而是前向声明。

(2)只需要一个。我不知道为什么你会再期待。我认为给定的编译器可能会生成多个,但为什么呢?如果确实如此,那么它们的错误列表就会非常高。

(3)见(2)。