C++ VC选择了错误的运算符<&书信电报;仅在第一次呼叫时过载。缺陷

C++ VC选择了错误的运算符<&书信电报;仅在第一次呼叫时过载。缺陷,c++,visual-c++,operator-overloading,c++-standard-library,C++,Visual C++,Operator Overloading,C++ Standard Library,我花了一些时间删除所有不流畅的代码,这是我的问题 --File.h--- 基本上,第一个操作符看起来像一个编译器bug。您可能希望尝试使用最新的VC编译器(目前是VC10 Beta2),如果没有修复,请与VC团队联系(您将需要一个完整的自包含的repo)。如果它是固定的,你应该利用你找到的工作,继续你的生活。改变 DataOutput*输出(file.CreateOutput(false,false)) 到 DataOutput*output=file.CreateOutput(false,fa

我花了一些时间删除所有不流畅的代码,这是我的问题

--File.h---


基本上,第一个
操作符看起来像一个编译器bug。您可能希望尝试使用最新的VC编译器(目前是VC10 Beta2),如果没有修复,请与VC团队联系(您将需要一个完整的自包含的repo)。如果它是固定的,你应该利用你找到的工作,继续你的生活。

改变

DataOutput*输出(file.CreateOutput(false,false))

DataOutput*output=file.CreateOutput(false,false);这可能会奏效。但是要使它成为一个合理的lib函数,您不必在返回指针后进行清理,而应该返回一个实际的对象。

这是一个编译器错误(不仅仅看起来像),因为它为两个相同的语句生成不同的调用绑定

    *output << "test"; // Calls wrong overload
    *output << "test"; // Calls right overload!!!

这意味着这不是一个有效的C++程序(C中不允许使用代码>空main //>代码,它在C或C++中是无效的。因此,您一直在运行编译无效源代码的结果。结果可能是任何事情


VisualC++编译器不诊断>Vultmain < /C> >的事实只是<强>另一个编译器错误>。看起来像是编译器错误。这是一个明确的编译器错误。顺便说一下,它也在VS2010 beta2上重新编程。如前所述,这已经是一个非常棒的bug报告-你可以将它发布到几乎所有的地方。我会尽快发布。至少我没有浪费这么多时间,因为标准流类是不可复制的(

std::basic_ios
具有私有复制构造函数和复制赋值操作符),这意味着对于标准流(或在相同方法中构建的任何流),按值返回流本身不是一个选项。智能指针或包装器可以在这里工作,但这可能是另一种情况,取决于OP的设计。这在VC7中不起作用。但是有很多解决方法,比如在两个调用之前添加
*output
output->somethod()
。至于设计部分,这不是实际的代码,这是我试图重现的错误。在原始代码中,相同的方法返回一个智能指针到基类,并且该方法本身是虚拟的,允许除<代码>文件>代码>之外的类返回不同的流派生对象。+ 1,“VisualC++编译器不诊断虚main的事实只是另一个编译器错误。”抱歉,但这是错误的。代码是不可移植的,但是VisualC++文档特别声明它是允许的(),C++标准明确地允许实现除了代码< int(空)> />代码>或<代码> int(int,char *])< />代码之外,还可以接受“代码>主代码<代码>。微软可以说超越了标准所允许的范围,但是他们没有破坏有效的代码,所以这是一个合法的扩展。代码在所有独立的C++实现上都不符合,但是在这个特定编译器上是正确的。@ Booviig:对不起,但您错了。首先,实际意义:代码不会使用例如g++编译。Visual C++编译器可能会毫无意义地摆脱任何问题,只要它首先发出一个诊断结果。这就是标准对它的所有要求,但是,它没有做到这一点。所以,这不是标准的一致。@ Beoviigt:另外,你认为VisualC++不是托管的实现,而是独立的实现。我想你可能不知道那意味着什么。但是FIY,如果这是真的,那就比对
main
过于宽容要可耻得多:-(我喜欢VisualC++,我认为这个迷迷的东西,假装它是完美的,对任何事情都不是很重要。照我的意思,我的建议是。”阿尔夫:好吧,我得到独立和托管混合。而且没有要求为非便携代码生成警告。例如,你不会辩称需要警告。对于
intmain(intargc,char*argv[],char*envp[])
您愿意吗?
#include <File.h>

File::File(const std::string &strPath)
: m_strPath(strPath)
{
}

DataOutput<char> *File::CreateOutput(bool bAppend, bool bBinary)
{
    return new DataOutput<char>(m_strPath, bAppend, bBinary);
}
#include <File.h>

void main()
{
    File file("test.txt");

    DataOutput<char> *output(file.CreateOutput(false, false));

    *output << "test"; // Calls wrong overload
    *output << "test"; // Calls right overload!!!

    output->flush();
    delete output;
}
00414114test
basic_ostream<char>& basic_ostream<char>::operator<<(
    const void *)
basic_ostream<char>& __cdecl operator<<(
    basic_ostream<char>&,
    const char *)
    *output << "test"; // Calls wrong overload
    *output << "test"; // Calls right overload!!!
    void main()