直接の質問に答えるには:
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*
いるが、そのような変換は利用できないと警告します。
直接的ではない質問に答えるには:
私は何を見ていますか?
あなたが私たちに示していない何か他のことがここで起こっているに違いありません。1つの理論がありますが、それは単なる理論です。
実際のコードでは、 ではなく、実際に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];
}
これはコンパイルされます - それは合法であり、私が知る限り、正当なコードです。これも恐ろしくひどいコードですが、あなたはすでにそれを知っていると思います。