重载流产生两种不同的结果

时间:2013-08-22 00:29:28

标签: c++ mfc visual-studio-2005 ofstream overloading

我在一个特定文件cfileop.cpp中重载了ofstream运算符,如下:

std::ostream& operator<<(std::ostream& ofs, LPCWSTR wideString)
{
    //ofs << ConvertUnicodeToUtf8(wideString).GetBuffer();
    ofs << CW2A(wideString,CP_UTF8);
    return ofs;
}

在此特定文件中,使用该运算符进行的任何调用都非常有效。我没有任何问题。

但是,我需要在另一个文件中重载此相同的运算符。当我在另一个地方acrazyapp.cpp重复这个调用时,我得到类似这样的输出:

02962AE010021A3402961018
029621C010021A3410022AF0
029621C010021A34029619D0
029621C010021A3410022A68

我认为,只需将过载位置切换到acrazyapp.cpp即可解决。但是,这导致cfileop.cpp无法正确输出。为了满足这两个要求,我将调用移动到头文件ch_ofstream.h,并将其包含在两个cpp文件中。但是,在这种情况下,我收到此错误:致命错误LNK1169:找到一个或多个多重定义的符号。

如何在不合并cpp文件的情况下确保上述ofstream运算符在两个cpp文件中都正确重载?

谢谢!

1 个答案:

答案 0 :(得分:1)

由于未在其他文件中声明重载,因此最终调用operator<<(void*),它会打印指针指向的地址。

与任何其他函数一样,您应该在一个头文件中声明它,并在一个源文件中实现。