STD ::向量有转换操作员吗?我看到了什么

Does std::vector have conversion operators? What am I seeing?

本文关键字:我看 什么 操作员 向量 转换 STD      更新时间:2023-10-16

Visual Studio 2010 Windows 7。

编辑:这是我没有编写的非常古老的代码,这是一个大旧混乱的一部分,深深地植根于代码库。它不会很快改变。不过,我很高兴你们都证实了我的想法:这本身应该是不可能的。

我有等效的代码:

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

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

它有效。

STL向量是否提供了一些铸造运算符或 返回向量中的第一个元素?

我弄清楚了,我很尴尬。

实际的代码有一大堆可怕的Typedefs,Casel Cased and Shitfer,它们都在一个地方,格式不佳。不用说,这是一个bit子,所有的名字都非常相似。

结构中的类型实际上是一个指针,"窗口小部件 *"的类型与窗口小部件指针的向量非常相似。

代码表现得很正常,现有代码库是一块蒸堆,问题最终位于椅子和键盘之间。

感谢您的演奏。

这是一个简单的误解。

向量的定义下面:

vector<int*> a[10];

并不意味着定义A(10型,int*-type)向量,而是您得到(10尺寸,vector<int*>-type)数组;

STL向量提供了一些铸造操作员或 返回向量中的第一个元素?

相关的东西是阵列返回元素类型的指针:

int* b[10];

然后

int** ptrb = b;

是合法的。

回答您的直接问题:

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];
}

this 编译 - 它甚至是合法的,而且从我的说法中,合法代码。这也是可怕的,可怕的代码,但我认为您已经知道。