2

そのため、テンプレート クラスに問題があります。

<!-- language: lang-c++ -->

template<class T>
class List {
  class Counter
  {       
    T real;
    T imaginary;
    Counter *next;
 //....
  public:
    Counter(T a=0,T b=0);                  
    virtual ~Counter();                     
    friend ostream& operator<<(ostream&,Counter&);
    friend ostream& operator<<(ostream&,List&);
  };
  Counter* first;
  Counter* last;
//....
};

しかし、私は方法にいくつかの問題があります。関数を次のように書くと

template<class T> Counter operator/(Counter &one,...)  

VC++ 10 の Counter を見ると、次のように表示されます

<error_type>&one

例えば。template<class T>コード内のどこでも Counter クラスを使用する必要がありますか?

//Methods
//Counter. For example some methods
Counter operator/(Counter& one,Counter& two){}
ostream& operator<<(ostream&os,Counter&x){}
istream& operator>>(istream&is,Counter&x){}
 //List
template<class T>void List<T>::add(Counter *T,int i,bool c){}
4

1 に答える 1

2

クラス定義の内部または外部のどちらで演算子を定義するか (メンバー関数であるかグローバル演算子であるかに関係なく) によって異なります。

クラス定義内で行う場合template<T>、 も も必要ありませんList<T>:

template <typename T>
class List
{
public:
  class Counter
  {
    /* This is a global operator* defined inside the class, and
       as friend. */
    friend Counter operator*(const Counter &c1, const Counter &c2)
    {
      return Counter();
    }
  };

};

(私の定義は、operator*常に空のオブジェクトを返すため、実際には役に立たないことに注意してくださいCounter。これは、構文を示すためのものです。)

ただし、クラスの外で (したがって、テンプレート定義の外でListも) 演算子を定義する場合は、関数テンプレート定義の完全な構文を使用する必要があります。

template <typename T>
typename List<T>::Counter operator/(const typename List<T>::Counter &c1, const typename List<T>::Counter &c2)
{
  return List<T>::Counter();
}

ご覧のとおり、これには次の 3 つの手順が含まれます。

  1. を、定義の前に...でtemplate <....>囲まれたすべてのテンプレート パラメーターの名前と共に置きます。<>
  2. ネストされたタイプ名であるList<T>::Counterことを示すために使用しますCounter
  3. 依存型(つまり、テンプレート引数に依存する型)にネストされているtypename List<T>::Counterため使用します。Counter
于 2012-12-26T14:19:50.253 に答える