2012-10-24 38 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; 

是合法的。

相關問題