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

这取决于您是在类定义内部还是外部定义运算符(无论它们是成员函数还是全局运算符) 。

如果您在类定义中执行此操作,则不需要 for template<T>,也不需要 for 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();
}

如您所见,这涉及三个步骤:

  1. template <....>, 所有模板参数的名称放在定义之前的<...中。>
  2. 用于List<T>::Counter指示这Counter是一个嵌套类型名
  3. 使用typename List<T>::Counter因为Counter嵌套到依赖类型(即依赖于模板参数的类型)。
于 2012-12-26T14:19:50.253 回答