我已创建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)
对其进行了编译,似乎Foo
和ConsoleApplication1
都包含shared_ptr<Foo>
的实现。这是不是意味着有两个shared_ptr<Foo>
显式实例化?
答案 0 :(得分:2)
(1)不是重新定义,而是前向声明。
(2)只需要一个。我不知道为什么你会再期待。我认为给定的编译器可能会生成多个,但为什么呢?如果确实如此,那么它们的错误列表就会非常高。
(3)见(2)。