Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ 为fstream重写streambuf_C++_Stl - Fatal编程技术网

C++ 为fstream重写streambuf

C++ 为fstream重写streambuf,c++,stl,C++,Stl,我正在将非常旧的遗留代码从VS2008移植到VS2013。这个代码库的一部分是一个相当复杂的文件日志库,它覆盖streambuf并将其与fstream关联。它通过继承streambuf和fstream来实现这一点 但当我尝试将生成的DLL与使用它的另一个DLL链接时,我得到: 1>syscored.lib(syscored.dll):错误LNK2005:“public:void\uu thiscall” 标准::基本流程::关闭(无效)” (?关闭@?$basic)_fstream@DU?$ch

我正在将非常旧的遗留代码从VS2008移植到VS2013。这个代码库的一部分是一个相当复杂的文件日志库,它覆盖streambuf并将其与fstream关联。它通过继承streambuf和fstream来实现这一点

但当我尝试将生成的DLL与使用它的另一个DLL链接时,我得到:

1>syscored.lib(syscored.dll):错误LNK2005:“public:void\uu thiscall”
标准::基本流程::关闭(无效)”
(?关闭@?$basic)_fstream@DU?$char_traits@D@std@@@std@@QAEXZ)已存在
在iptsrvfl.obj中定义
1> syscored.lib(syscored.dll):错误LNK2005:
“public:void\u thiscall std::basic\u fstream::`vbase析构函数'(void)”
(???$basic)_fstream@DU?$char_traits@D@std@@@std@@QAEXZ)已存在
在iptsrvfl.obj中定义
基本上,从fstream继承会导致DLL导出fstream的一些符号。使用该DLL的类也使用标准的fstream实例,close()和dtor()的符号被视为已定义

我已尝试将fstream派生类更改为使用包含而不是继承,但无法将自定义streambuf与包含的流相关联。它不是通过公共接口公开的。(我们在fstream的ctor中调用init(streambuf)

谁能告诉我: 1) 如何将streambuf与包含的流相关联,或 2) 如何避免此符号冲突


谢谢。

您可以通过链接到CRT DLL来避免符号冲突。静态编译只有在编译一个独立的EXE或一个不输出任何标准C++类型(即纯C接口或COM DLL)的DLL时才有意义。

< P>如果导出类继承了未显式导出的模板实例化,则编译器隐式导出此模板实例化。你不想这样做,因为这会导致你所看到的那种错误

因此,您不应该像以前那样导出logger类。事实上,您应该很少导出类。如果需要使类的实例在DLL之外可用,请导出类工厂(函数)。仅当您希望其他人继承某个类时才导出该类,并且永远不要导出任何类型的模板。您可以导出特定的模板实例化


如果您需要从标准库模板继承,并且希望其他人进一步继承您的类,则可能必须使其成为仅标题的所有内联类,或者可能有选择地导出其方法而不是类本身。

“streambuf和fstream的继承”。同一个类是同时继承streambuf和fstream,还是两个不同的类?两个不同的类。streambuf派生类不是我真正的问题。问题是我如何将它与fstream相关联。看起来遗留代码是照本宣科的。没什么问题。显示如何链接DLL(完整链接器命令)。是否使用include-guard(或
#pragma once
)@0x499602D2:这是编译时的事情,不是链接时。我不确定静态链接是什么意思。我正在链接到生成的DLL的导入库。您正在动态链接您的DLL。您如何链接到CRT/MT还是/MD?我正在使用/MD和/mdt谢谢。解释得很好。