【问题标题】:Calling a static member function of a C++ STL container's value_type调用 C++ STL 容器的 value_type 的静态成员函数
【发布时间】:2008-10-13 11:03:06
【问题描述】:

我试图弄清楚为什么以下内容不起作用。我有一个 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 的假设...... 谢谢!

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    您正在通过变量实例而不是变量类型访问 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 一样 typedef,你不会对向量模板参数的假设进行硬编码,而是编写干净的代码。


    编辑:应问题所有者的要求扩展以解释此问题的行为:

    范围解析运算符::precedence 比任何其他C++ 运算符都高。这包括来自对象. 运算符的成员访问。因此,当您编写以下内容时:

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

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

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

    最终首先解决的是SVector&lt;double, 2&gt;::Dim() 部分。这将强制通过变量v 声明的向量实例具有一个名为 SVector 的模板化内部类。因为这不会发生,所以会导致错误:

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

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

    【讨论】:

    • 非常感谢,太好了。我不知道不允许通过实例访问 value_type。您是否有机会知道为什么不允许这样做(如果允许会出现什么问题)?
    • @yungchin 检查我刚刚添加的解释是否对这个问题足够清楚。
    • 如果被允许,什么都不会出错——因为 C++ 是静态类型的,它已经知道 v 是 std::vector,但是你又已经知道 v 是什么,所以它使真的没有区别。我猜 C++ 设计者想要明确区分静态成员和实例成员。
    • @Greg 和 smink:太棒了,谢谢。我现在完全清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多