Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何';重命名';不使用继承的模板实例化?_C++_Visual Studio 2010_Templates_Pdb Files - Fatal编程技术网

C++ 如何';重命名';不使用继承的模板实例化?

C++ 如何';重命名';不使用继承的模板实例化?,c++,visual-studio-2010,templates,pdb-files,C++,Visual Studio 2010,Templates,Pdb Files,假设您在应用程序中使用一个模板类,例如std::tuple(或std::shared_ptr,或其他),并且您有如下实例化: typedef std::tuple<Book,Library> BookLibrary; typedef std::tuple<Book,Chapter,Reader> BookChapterReader; class BookChapterReader : public std::tuple<Book,Chapter,Reader>

假设您在应用程序中使用一个模板类,例如std::tuple(或std::shared_ptr,或其他),并且您有如下实例化:

typedef std::tuple<Book,Library> BookLibrary;
typedef std::tuple<Book,Chapter,Reader> BookChapterReader;
class BookChapterReader : public std::tuple<Book,Chapter,Reader>
   {
   };
typedef std::tuple BookLibrary;
typedef std::元组BookChapterReader;
然后在其他模板类中使用这些实例化,例如,std::map作为类中的成员:

class X
   {
   ...
   private:
      std::map<Library,BookChapterReader> m_data;
   };
X类
{
...
私人:
地图m_数据;
};
然后,生成的PDB文件将包含如下描述(请参见Microsoft调试工具的DBH实用程序):

std::\u树
如果您有很多这样的结构,那么PDB文件增长非常快,直到链接器拒绝链接您的应用程序为止(显然,PDB文件的限制是1GB)

解决方案可以是创建模板化实例化的子类,如下所示:

typedef std::tuple<Book,Library> BookLibrary;
typedef std::tuple<Book,Chapter,Reader> BookChapterReader;
class BookChapterReader : public std::tuple<Book,Chapter,Reader>
   {
   };
class BookChapterReader:public std::tuple
{
};
这将严重缩短符号。现在提到的是:

std::_Tree<std::_Tmap_traits<Library,BookChapterReader,std::less<Library>,std::allocator<std::pair<Library const ,BookChapterReader> >,0> >
std::\u树
然而,通过使用继承,我们引入了一种风险,即可能会向继承的类添加数据,并且我们可能需要引入一个虚拟析构函数(在本例中我不希望这样)

< C++ >(或VisualStudio)似乎有一个限制:

  • 如果我只使用typedef,符号会变得太大
  • 如果我使用继承,似乎我想扩展std::tuple,但我不想这样做

没有一种更干净的方法来“重命名”模板安装而不使用继承吗?

创建自己的
less
allocator
实现版本,而不是依赖具有很长名称的默认版本

std::map< Library, BookChapterReader, CompareLibrary, MyAllocator > m_data;
std::mapm_数据;

分配器类非常简单,比较函数也非常简单。

我认为VS2010不支持它,我也不知道PDB“扩展”如何处理它,但是你可以尝试使用BookChapterReader=std::tuple一个类型需要有一个唯一的名称,以便不同的Tu知道他们谈论的是同一件事。因此,缩短调试符号的唯一机会是创建新的/不同的类型(注意typedef/using只会创建别名)。@JoachimPileborg
using X=foo
typedef foo X这样的差异将是令人惊讶的(但实际上,尝试和查看并不需要花费太多)@Patrick顺便说一句,让你的问题更糟的是VS2010没有真正的C++11支持,它使用“
std::tr1::tuple
”来表示真正应该简单的“
std::tuple
”(我认为VS2012或更高版本确实使用了它)。但这不是答案,我知道…@gx_x,我知道。VS2010的实现甚至限于10个维度。这就是为什么我使用boost::fusion::vector而不是std::tuple,但我希望示例足够简单。
std::less
是18个字符<代码>比较库
为14。差别不大。@Plasmah:您忘记了自定义类应该放在名称空间中;因此,您至少要查看
X::Y
@MatthieuM.:它还应该有一个合适的名称,所以请放弃名称空间要求,将内容缩短。分配器很长,并且由于某种原因,第二个模板参数类型没有使用typedef。@Plasmah:老实说,我唯一能想到的就是抛弃MSVC,直到他们实现了对类型的适当支持,比如。。。在PDB开始时使用
type->id
映射,然后仅通过
id
引用类型?