2012-10-24 107 views
2

Windows 7上的Visual Studio 2010旗舰版。std :: vector是否有转换运算符?我在看什么?

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

我有equivelant代码:

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

编译时没有警告? – gogoprog

+2

下面是如何生成最小示例以演示您描述的代码的示例:http://ideone.com/rvE2w9。正如你所看到的,它不会编译(在该编译器上)。如果我的代码与您的真实代码不同,那么在您的描述中忽略了您真实代码中的某些内容,这可能是相关的。所以同样,*显示完整的代码*。 –

回答

5

我明白了,我很尴尬。

实际的代码有一大堆HORRIBLY命名的typedefs,骆驼装载和缩短,所有在一个地方,它的格式很差。毋庸置疑,这是一个婊子阅读,所有的名字都非常相似。

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

代码的行为完全正常,现有的代码库是一堆蒸汽,问题最终出现在椅子和键盘之间。

感谢您的参与。

+0

我的哀悼。虽然,我不得不承认,我对typedef的名字很感兴趣。分享他们的想法? – Xeo

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

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

1

这是一个简单的误解。

下面矢量的定义:

vector<int*> a[10]; 

这不是意味着定义(10-尺寸,INT *型)载体,,您不如得到一个(10-大小,vector<int*>-type)阵列;

是否STL矢量提供一些转换运算符或东西 返回的第一个元素的载体?

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

int* b[10]; 

然后

int** ptrb = b; 

是合法的。

相关问题