1

これが私のプログラムです:

#include <iostream>
#include <string>
using namespace std;

template <class T>
class Example
{
  private:
    T data;

  public:
    Example() { data = 0; }
    void setData(T elem) { data = elem; }

    template <class U>
    friend ostream& operator << (ostream &, const Example<U>&);

    friend ostream& operator << (ostream &, const Example<char>&);

    friend string operator + (const Example<char> &, const Example<char> &);

    template <class U>
    friend U operator + (const Example<U> &, const Example<U> &);
};

template <class U>
U operator + (const Example<U> &a, const Example<U> &b)
{
    U c;
    c = a+b;
    return(c);
}

string operator + (const Example<char> &a, const Example<char> &b)
{
       string a1("");
       a1+=a.data;
       a1+=b.data;
       return(a1);

}

template <class T>
ostream& operator << (ostream &o, const Example<T> &t)
    {
      o << t.data;
      return o;
    }


ostream& operator << (ostream &o, const Example<char> &t)
{
  o << "'" << t.data << "'";
  return o;
}



int main()
{
    Example<int> tInt1, tInt2;
    Example<char> tChar1, tChar2;

    tInt1.setData(15);
    tInt2.setData(30);

    tChar1.setData('A');
    tChar2.setData('B');

    cout << tInt1 << " + " << tInt2 << " = " << (tInt1 + tInt2) << endl;
    cout << tChar1 << " + " << tChar2 << " = " << (tChar1 + tChar2) << endl;
    return 0;
}

2 つの文字を返すことができる文字列にするにはどうすればよいですか? 私は複数の方法を試しましたが、どれも機能しないようです。文字が参照渡しされていることに関係があるのではないかと思います。

編集:わかりましたので、その特定の機能を問題なく動作させました。これでコンパイルできましたが、何かが表示される前にセグメンテーション違反が発生しました。U データ型の加算に問題があります。A と B を加算して AB を返しますが、15 と 30 を加算しません。また、ご協力いただきありがとうございます。私はまだプログラミングに慣れていないので、本当に感謝しています。

4

4 に答える 4

1
#include <sstream>

string operator + (const Example<char> &a, const Example<char> &b) {
    std::ostringstream sstream;
    sstream << a << b;
    return sstream.str();
}
于 2013-03-19T09:55:04.010 に答える
0

動作する最も簡単なこと:

string operator + (const Example<char> &a, const Example<char> &b)
{
    return { a.data, b.data };
}

「古い」コンパイラを使用している場合:

string operator + (const Example<char> &a, const Example<char> &b)
{
    char both[] = {a.data, b.data};
    return string(both, both+2);
}

ライブでご覧ください:http://liveworkspace.org/code/2ORW8E$0

編集の質問への更新:ここにも大きな問題(無限再帰)があります:

template <class U>
U operator + (const Example<U> &a, const Example<U> &b)
{
    U c;
    c = a+b; // NEEDS TO BE a.data + b.data;
    return(c);
}

修正バージョンは次のとおりです。

#include <iostream>
#include <string>
using namespace std;

template <class T>
class Example
{
private:
    T data;

public:
    Example() : data()
    {
    }
    void setData(T elem)
    {
        data = elem;
    }

    template <class U>
    friend ostream& operator << (ostream &, const Example<U>&);
    friend ostream& operator << (ostream &, const Example<char>&);
    friend string operator + (const Example<char> &, const Example<char> &);

    template <class U>
    friend U operator + (const Example<U> &, const Example<U> &);
};

template <class U>
U operator + (const Example<U> &a, const Example<U> &b)
{
    U c;
    c = a.data+b.data;
    return(c);
}

string operator + (const Example<char> &a, const Example<char> &b)
{
    char both[] = {a.data, b.data};
    return string(both, both+2);
}

template <class T>
ostream& operator << (ostream &o, const Example<T> &t)
{
    o << t.data;
    return o;
}


ostream& operator << (ostream &o, const Example<char> &t)
{
    o << "'" << t.data << "'";
    return o;
}

int main()
{
    Example<int> tInt1, tInt2;
    Example<char> tChar1, tChar2;
    tInt1.setData(15);
    tInt2.setData(30);
    tChar1.setData('A');
    tChar2.setData('B');
    cout << tInt1 << " + " << tInt2 << " = " << (tInt1 + tInt2) << endl;
    cout << tChar1 << " + " << tChar2 << " = " << (tChar1 + tChar2) << endl;
    return 0;
}
于 2013-03-19T09:56:46.973 に答える
0

次のことができます。

string operator + (const Example<char> &a, const Example<char> &b)
{
    std::ostringstream ss;
    ss << a.data << b.data;

    return ss.str();
}
于 2013-03-19T10:00:14.987 に答える
0

タイプ のデータを保持するstd::stringと呼ばれるメンバーがある場合は、 の組み込み機能を使用するだけです。data<T>

std::string operator+(const Example<char> &a, const Example<char> &b)
{
    std::string result("");
    result += a.data;
    result += b.data;
    return result;
}
于 2013-03-19T09:55:27.423 に答える