gpt4 book ai didi

c++ - 有多少个模板实例化?

转载 作者:行者123 更新时间:2023-11-28 03:02:45 26 4
gpt4 key购买 nike

我创建了 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) 处使用了哪个实例化(如果有很多)?


更新 1:
我用 Assembly With Source Code (/FAs) 编译了这个, 似乎都是 Foo ConsoleApplication1 包含 shared_ptr<Foo> 的实现.这是否意味着有两个 shared_ptr<Foo>显式实例化?

最佳答案

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

(2)只需要有一个即可。我不知道你为什么期待更多。我认为给定的编译器可能会产生不止一个,但为什么呢?如果确实如此,它将在他们的错误列表中占据很高的位置。

(3) 见(2)。

关于c++ - 有多少个模板实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com