C ++类嵌套到模板类中

时间:2012-12-26 13:45:39

标签: c++

所以我的模板类有些问题。

<!-- 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){}

1 个答案:

答案 0 :(得分: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();
}

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

  1. 在定义之前,将template <....> ... <中包含的所有模板参数的名称放在>上。
  2. 使用List<T>::Counter表示Counter是嵌套的类型名称
  3. 使用typename List<T>::Counter因为Counter嵌套在依赖类型中(即依赖于模板参数的类型)。