std :: vector是否有转换运算符?我在看什么?

时间:2012-10-24 15:38:45

标签: c++ stl vector

Windows 7上的Visual Studio 2010 Ultimate。

编辑:这是一个非常古老的代码,我没有写,是一个很大的旧混乱,深深植根于代码库。这不是很快就会改变的。虽然,我很高兴你们都确认了我的想法:这本身就不可能。

我有等效代码:

typedef std::vector<Widget*> widget_vector_t;

typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;

然后,在一个类中,我有一个WIDGET_STRUCT成员:

WIDGET_STRUCT widgets_;

在某些成员方法的正文中,我看到了......这...... THING

Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];

要清楚,我的理解是这是将Widget指针的向量分配给Widget指针。

它有效。

STL向量是否提供某些强制转换操作符或某些返回向量中的第一个元素?

3 个答案:

答案 0 :(得分:5)

我想通了,我很尴尬。

实际代码中有大量名为typedef的HORRIBLY,驼峰和缩短,所有这些都在一个地方,而且格式很差。毋庸置疑,这是一个婊子,所有的名字都非常相似。

struct中的类型实际上是一个指针数组,“Widget *”的typedefed名称与Widget指针的向量非常相似。

代码行为完全正常,现有代码库是一个热气腾腾的堆,问题最终在于椅子和键盘之间。

感谢您的参与。

答案 1 :(得分:1)

这是一个简单的误解。

下面的矢量定义:

vector<int*> a[10];

这并不意味着定义一个(10-size,int * -type)向量,而是获得一个(10-size,vector<int*>-type)数组;

  

STL向量是否提供某些强制转换运算符或其他东西   返回向量中的第一个元素?

相关的是数组返回元素类型的指针:

int* b[10];

然后

int** ptrb = b;

是合法的。

答案 2 :(得分:0)

回答你的直接问题:

  

STL向量是否提供某些强制转换运算符或其他东西   返回向量中的第一个元素?

没有。这段代码无法编译:

#include <vector>
using namespace std;

class Widget {};

typedef std::vector<Widget*> widget_vector_t;

static const size_t SOME_SIZE_CONSTANT = 10;
static const size_t SOME_INDEX_CONSTANT = 0;
typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;

int main()
{
    WIDGET_STRUCT widgets_;
    Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];
}

编译器抱怨您尝试在vector<Widget*>Widget*之间进行转换,并且没有可用的转换。

回答你不太直接的问题:

  

我在看什么?

其他必须在这里发生,你没有向我们展示过。我有一个理论,但这只是一个理论。

在实际代码中,代替widget_array_typedef vector<Widget*>,它实际上可能是vector的子类,已为其提供了转换运算符。例如:

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;

class Widget {};

class widget_vector_t : public std::vector<Widget*>
{
public:
    operator Widget* () 
    {
        return front();
    }
};

static const size_t SOME_SIZE_CONSTANT = 10;
static const size_t SOME_INDEX_CONSTANT = 0;
typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;

int main()
{
    WIDGET_STRUCT widgets_;
    Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];
}

这个编译 - 它甚至是合法的,从我所知道的,合法的代码。它也是可怕的,可怕的代码,但我想你已经知道了。