鉴于此代码
template <typename T>
typename T::ElementT at (T const &a , T const &b)
{
return a[i] ;
}
做什么
typename T::ElementT
和
a[i]
意思?
答案 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;
//...
};
现在,如果T
是sample
,那么您可以编写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::vector
或std::map
)。
但是,正如Nawaz在他的评论中指出的那样,a
的类型为T
,并且T
预计会有嵌套类型ElementAt
,在这种情况下a
{{1}} 1}}不能是一个数组。