簡體   English   中英

有多少個模板實例?

[英]How many instantiations of template there are?

我已經創建了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;

我在ConsoleApplication1使用Foo類:

#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)不是重新定義,而是前向聲明。

(2)只需要一個。 我不知道為什么你會再期待。 我認為給定的編譯器可能會生成多個,但為什么呢? 如果有的話,它會在他們的錯誤列表中占據相當高的位置。

(3)見(2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM