帮助在代码模板中

时间:2011-04-02 07:02:01

标签: c++

鉴于此代码

template <typename T>
typename T::ElementT at (T const &a , T const &b)
{
        return a[i] ;
}

做什么

typename T::ElementT 

a[i]

意思?

3 个答案:

答案 0 :(得分:3)

typename T::ElementT 

由于T:ElementT是一个从属名称,因此您可以在其前面看到关键字typename。它告诉编译器ElementT是经过测试的类型不是

至于a[i],似乎T是一个已定义operator[]的类,在您编写a[i]时会调用该类。例如,T可以sample为(部分)定义:

class sample
{
 public:
      typedef int ElementT; //nested type!

      //...

      ElementT operator[](int i) 
      {
          return m_data[i];
      }

      ElementT *m_data;
      //...
};

现在,如果Tsample,那么您可以编写T::ElementT以及{em>类型 a[i]的{​​{1}} }。在这种情况下,当T是样本时,我假设索引T类型i

答案 1 :(得分:0)

我猜在代码中T总是一个运算符[]重载并具有子类定义ElementT的类,任何其他没有这两种特性的类在编译时都会出错。

答案 2 :(得分:0)

typename T::ElementT 

约翰内斯在this entry中对C ++ FAQ进行了详尽的解释。

a[i]

此操作通常称为“订阅”,并访问a中的第i个元素。为此,a必须是一个数组或一些重载订阅运算符的类(如std::vectorstd::map)。 但是,正如Nawaz在他的评论中指出的那样,a的类型为T,并且T预计会有嵌套类型ElementAt,在这种情况下a {{1}} 1}}不能是一个数组。