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向量是否提供某些强制转换操作符或某些返回向量中的第一个元素?
答案 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];
}
这个将编译 - 它甚至是合法的,从我所知道的,合法的代码。它也是可怕的,可怕的代码,但我想你已经知道了。