2

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

4

1 回答 1

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 中的 typedef 一样,您不会对向量模板参数的假设进行硬编码,而是编写干净的代码。


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

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

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>'

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

于 2008-10-13T11:15:34.093 回答