当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《调用C++STL容器的value_type的静态成员函数》经验,为你挑选了1个好方法。

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

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

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

template  class SVector; 
typedef SVector Vector; //two-dimensional SVector containing doubles

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

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

 error: ‘SVector’ is not a base of 
 ‘std::vector, std::allocator > >

这让我很困惑.我可以替换明显有问题的线路

unsigned u = Vector::Dim();

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



1> Jorge Ferrei..:

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

方法1 - 这工作:

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

方法2 - 或者:

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

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


编辑:展开以解释问题所有者请求的此问题的行为:

范围解析操作者::具有更高的优先级比任何其他C++运算符.这包括来自对象.操作员的成员访问权限.因此当你写下这样的东西:

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

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

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

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

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

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有