[英]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)
編譯了這個,似乎Foo
和ConsoleApplication1
都包含shared_ptr<Foo>
。這是不是意味着有兩個 shared_ptr<Foo>
顯式實例化?
(1)不是重新定義,而是前向聲明。
(2)只需要一個。 我不知道為什么你會再期待。 我認為給定的編譯器可能會生成多個,但為什么呢? 如果有的話,它會在他們的錯誤列表中占據相當高的位置。
(3)見(2)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.