2

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_;

在一些成员方法的主体中,我看到了这个......这个......事情

Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];

需要明确的是,据我了解,这是将 Widget 指针向量分配给 Widget 指针。

它有效。

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

4

3 回答 3

5

我想通了,我很尴尬。

实际代码有一大堆可怕的名为 typedef,驼峰式大小写和缩短,都在一个地方,而且格式很差。不用说,读起来很笨,而且所有的名字都非常相似。

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

代码表现完美正常,现有代码库是一堆热气腾腾的东西,问题最终出在椅子和键盘之间。

感谢参与。

于 2012-10-24T16:56:54.773 回答
1

这是一个简单的误解。

向量定义如下:

vector<int*> a[10];

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

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

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

int* b[10];

然后

int** ptrb = b;

是合法的。

于 2012-10-24T17:23:20.533 回答
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];
}

编译器抱怨您试图在 avector<Widget*>和 a之间进行转换Widget*,并且没有这样的转换可用。

要回答您不太直接的问题:

我在看什么?

这里一定发生了一些你没有向我们展示的事情。我有一个理论,但这只是一个理论。

在实际代码中,它可能实际上是为其提供了转换运算符的子类,而不是widget_array_a 。例如: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];
}

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

于 2012-10-24T16:31:43.767 回答