Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ &引用;使用声明;不在RADStudio 2010工作_C++_C++builder_C++builder 2010_Using Declaration - Fatal编程技术网

C++ &引用;使用声明;不在RADStudio 2010工作

C++ &引用;使用声明;不在RADStudio 2010工作,c++,c++builder,c++builder-2010,using-declaration,C++,C++builder,C++builder 2010,Using Declaration,我正在从VCLTStream类派生一个新类: // A stream based on a temporary file, deleted when the stream is closed class TTempFileStream : public TStream { ... public: using TStream::Seek; __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin) {

我正在从VCL
TStream
类派生一个新类:

// A stream based on a temporary file, deleted when the stream is closed

class TTempFileStream : public TStream
{
...
public:
  using TStream::Seek;

   __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin)
  {
    return 0; // for simplicity!
  }

  ... 
} ;
TStream
声明了Seek的以下两种变体:-

virtual int __fastcall Seek(int Offset, System::Word Origin)/* overload */;
virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin)/* overload */;
但我在编译类时收到以下W8022警告:-

[BCC32 Warning]_utils.h(166): W8022 
'_fastcall TTempFileStream::Seek(const __int64,TSeekOrigin)' hides virtual function '_fastcall TStream::Seek(int,unsigned short)'
使用声明应该解决这个问题吗


为了将这个问题拖回正轨,我知道TStream::seek的两个版本是如何相互关联的,我只是试图获得派生类公开的继承seek(int,int)方法。为什么我的
不使用
声明这样做

您根本不需要
using
语句,所以请将其丢弃。您正在重写64位
Seek()
方法。这就是你所需要做的。您可以免费获得32位
Seek()
方法,因为它是
TStream
的公共方法,并且您在派生类上使用
public
继承。您无需声明任何内容即可获取或使用32位
Seek()
方法。只要您不重写它,它将在内部调用您的64位重写
Seek()

class TTempFileStream : public TStream
{
...
public:
    ...
    virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin)
    {
        return 0; // for simplicity!
    }
    ... 
};

仅供参考,如果您只需要在流关闭时删除临时文件,则根本不需要派生类。您可以按原样使用RTL的
THandleStream
,从Win32 API
CreateFile()
函数向其传递
句柄
,在该函数中,您可以将
FILE\u标志\u DELETE\u ON\u CLOSE
标志指定为
CreateFile()
Roddy,您的代码非常正确

使用TStream::Seek添加时,代码按预期工作(已测试);否则,如警告所述,将隐藏基类方法。(C++语言的这一部分,里米第一次和你有不同意见)。p>
<>警告是一个错误的正,非常古老,而且在C++ Builder中还没有纠正,至少从2006版本到XE4。p> 抱歉-太快点击“发布”了!问题是函数声明只因返回类型不同而不同。您必须发布父类,以便我们提供更多详细信息。@ThomasMatthews:父类Seek定义在这里:+1用于THandleStream建议,但我实际上需要修复警告:Using声明是为了这样做,通过公开基类签名-但警告仍然存在。好的,如果警告没有被修复,那么代码调用Seek(int,int)直接进入派生类,而不是通过基类方法。对于TStream来说,这基本上具有相同的效果,但在一般情况下,这可能是个坏主意。同样,在这种情况下使用
using
语句是错误的。你不需要它
TsekOrigin
被声明为枚举。如果不使用类型转换,则无法将
int
传递给它。任何调用
Seek(int,int)
的代码都将调用32位
Seek()
,然后它将在内部调用覆盖的64位
Seek()
TSeekOrigin
被实现为一个枚举,专门用于导致该行为,因此当引入64位
Seek()
时,预期32位
Seek()的现有代码不会中断。要调用64位Seek()的代码必须正确使用TSeekOrigin。我认为这是不正确的:看下面的代码:-TFileStream*ss=new TFileStream());TStream*s(ss);s->Seek(0,0);ss->Seek(0,0)。第一个seek()编译得很好,但是第二个seek()给出了一个警告,即用int初始化TSeekOrigin,所以a:它没有调用继承的(int,int)版本,b:不需要类型转换。。。?不管怎么说,这个问题的主要原因是如何消除W8022警告,而使用
删除
并不能做到这一点。从更多的(非TSTream)测试中,我认为using声明可以像我预期的那样工作,但是不管怎样都会输出警告消息,这很奇怪。没有
Seek(int,int)
重载。只有
Seek(int,unsigned short)
Seek(const\uu int64,TSeekOrigin)
<代码>搜索(0,0)
匹配前者,而不是后者。我能够在XE2中重现这个问题。我认为这是一个编译器错误。不需要使用
using
语句。它不存在于标准VCL
TStream
类中,它们工作正常,不会发出任何警告/错误。您的重写
Seek()
是正确的重写,它不会隐藏任何内容。编译器错误。感谢QC链接。我希望XE4中基于64位Clang的编译器能够解决这个问题。