调用C ++ STL容器的value_type的静态成员函数

时间:2008-10-13 11:03:07

标签: c++ stl

我正试图弄清楚为什么以下不起作用。我有一个std :: vector,我想调用一个静态成员函数,它包含value_type,如下所示:

std::vector<Vector> v;
unsigned u = v.value_type::Dim();

其中Vector实际上是模板化类型的typedef:

template <typename T, unsigned U> class SVector; 
typedef SVector<double, 2> Vector; //two-dimensional SVector containing doubles

和静态成员函数Dim()实际上内联了Vector的维数U.

现在编译器返回一条错误消息:

 error: ‘SVector<double, 2u>’ is not a base of 
 ‘std::vector<SVector<double, 2u>, std::allocator<SVector<double, 2u> > >
这让我很困惑。我可以用

代替明显有问题的行
unsigned u = Vector::Dim();

这是有效的,但显然是丑陋的,因为它硬编码关于v的value_type的假设... 谢谢!

1 个答案:

答案 0 :(得分:15)

您正在通过变量实例而不是变量类型访问value_type。

方法1 - 这有效:

typedef std::vector<Vector> MyVector;
MyVector v;
unsigned u = MyVector::value_type::Dim();

方法2 - 或者这个:

std::vector<Vector> v;
unsigned u = std::vector<Vector>::value_type::Dim();

如果你在方法1上输入类似方法,你就不会对矢量模板参数进行硬编码,而是编写干净的代码。


修改:根据问题所有者的要求展开解释此问题的行为:

范围解析运算符::比任何其他C ++运算符都高precedence。这包括来自对象.运算符的成员访问权限。因此当你写下这样的东西时:

unsigned u= v.value_type::Dim();

这解析为以下C ++代码:

unsigned u = v.SVector<double, 2>::Dim();

最终解决的问题是SVector<double, 2>::Dim()部分。这将强制通过变量v声明的向量实例具有名为SVector的模板化内部类。因为这不会发生,这会导致错误:

error C2039: 'SVector<double,2>' : is not a member of 'std::vector<_Ty>'

对于此模式的每次使用,都必须“扩展”STL vector(通过变量实例访问value_type而不是变量类型)。这不是一个好的解决方案,因为它会导致许多样板和不必要且不可维护的代码。通过遵循上述解决方案,您可以避免所有这些,并可以轻松地做您想要的。