2011-04-02 96 views
1

鉴于这种代码帮助在代码模板

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

什么

typename T::ElementT 

a[i] 

是什么意思?

+0

请问你从哪里得到这段代码?这似乎很无用?并且它是否有这些错误(我认为它应该是'const typename T :: ElementT',以及'b'和'i'是什么?)还是你把它们放进去? – sbi 2011-04-02 07:18:58

回答

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以及a[i]这是T的。在这种情况下,当T是样本时,我假设指数i类型int

0

我想在那个代码中T总是一个有operator []重载的类并且有一个子类defenition ElementT任何其他没有这两个品质的类都会在编译时产生错误。

0
typename T::ElementT 

这exhaustingly由约翰在this entry到C++ FAQ说明。

a[i] 

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

+0

在这种情况下,'a'不能是数组,因为'a'的类型是'T',它具有嵌套类型! – Nawaz 2011-04-02 07:19:19

+1

@Nawaz:确实。我想我今天一大早觉得不好。 – sbi 2011-04-02 07:20:44