C++类型 重载仅部分起作用

C++ Type Overloading only partly functional?

本文关键字:起作用 仅部 重载 类型 C++      更新时间:2023-10-16

我目前正在尝试创建一个通用字符串流类,例如,我可以将其用作函数中的参数,无需太多工作即可连接值。

我现在似乎面临着一个奇怪的怪异。

主.cpp:

#include <iostream>
#include "ExStream.h"
using namespace std;
void func1(string);
int main(int argc, char** argv) {
    ExStream ex;
    ex << "Hey";
    func1(ex);
    system("pause");
    return 0;
}
void func1(string s) {
    cout << "func1 " << s << endl;
}

ExStream.h

#ifndef EXSTREAM_H
#define EXSTREAM_H
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class ExStream {
private:
    string val;
    string toString(int);
    string toString(char);
    string toString(char*);
    string toString(const char*);
public:
    ExStream();
    friend ExStream& operator+(ExStream&, ExStream);
    friend ExStream& operator+(ExStream&, int);
    friend ExStream& operator+(ExStream&, char);
    friend ExStream& operator+(ExStream&, char*);
    friend ExStream& operator+(ExStream&, const char*);
    friend ExStream& operator+(ExStream&, string);
    friend ExStream& operator<<(ExStream&, ExStream);
    friend ExStream& operator<<(ExStream&, int);
    friend ExStream& operator<<(ExStream&, char);
    friend ExStream& operator<<(ExStream&, char*);
    friend ExStream& operator<<(ExStream&, const char*);
    friend ExStream& operator<<(ExStream&, string);
    operator char*();
    operator const char*();
    operator string();
    void out();
};
#endif

ExStream.cpp

#include "ExStream.h"
ExStream::ExStream() {
}
ExStream& operator+(ExStream& ex1, ExStream ex2) {
    ex1.val.append(ex2.val);
    return ex1;
}
ExStream& operator+(ExStream& ex, int i) {
    ex << ex.toString(i);
    return ex;
}
ExStream& operator+(ExStream& ex, char c) {
    ex << ex.toString(c);
    return ex;
}
ExStream& operator+(ExStream& ex, char* s) {
    ex << ex.toString(s);
    return ex;
}
ExStream& operator+(ExStream& ex, const char* s) {
    ex << ex.toString(s);
    return ex;
}
ExStream& operator+(ExStream& ex, string s) {
    ex.val.append(s);
    return ex;
}
ExStream& operator<<(ExStream& ex1, ExStream ex2) {
    ex1.val.append(ex2.val);
    return ex1;
}
ExStream& operator<<(ExStream& ex, int i) {
    ex << ex.toString(i);
    return ex;
}
ExStream& operator<<(ExStream& ex, char c) {
    ex << ex.toString(c);
    return ex;
}
ExStream& operator<<(ExStream& ex, char* s) {
    ex << ex.toString(s);
    return ex;
}
ExStream& operator<<(ExStream& ex, const char* s) {
    ex << ex.toString(s);
    return ex;
}
ExStream& operator<<(ExStream& ex, string s) {
    ex.val.append(s);
    return ex;
}
ExStream::operator char*() {
    return const_cast<char*>(val.c_str());
}
ExStream::operator const char*() {
    return val.c_str();
}
ExStream::operator string() {
    return val;
}
string ExStream::toString(int i) {
    stringstream ss;
    ss << i;
    return ss.str();
}
string ExStream::toString(char c) {
    stringstream ss;
    ss << c;
    return ss.str();
}
string ExStream::toString(char* s) {
    return string(s);
}
string ExStream::toString(const char* s) {
    return string(s);
}
void ExStream::out() {
    cout << "VAL: " << val << endl;
}

根据我的理解,这两个函数调用应该是完全相同的,但这个例子显示了相反的情况。

关于如何解决此问题的任何想法?
我使用 Visual Studio 2013 for Windows 8.1 x64。

我不知道你为什么要重新发明轮子,已经有附加方法可以做你试图做的同样的事情。 不要忘记字符串不是基元类型,C++它是一个对象。

对于您的问题,似乎强制转换(字符串)ex导致运行时错误。 也许你应该看看这个关于C++投射的 http://www.cplusplus.com/doc/tutorial/typecasting/。