2008-10-13 4 views
2

Я пытаюсь понять, почему следующее не работает. У меня есть зЬй :: вектор, и я хочу назвать статической функции члена он содержится value_type так:Вызов статической функции-члена контейнера C++ STL value_type

std::vector<Vector> v; 
unsigned u = v.value_type::Dim(); 

где вектор является фактически ЬурейеЕ для шаблонного типа:

template <typename T, unsigned U> class SVector; 
typedef SVector<double, 2> Vector; //two-dimensional SVector containing doubles 

и статическая функция-член Dim() фактически устанавливает размерность U вектора.

Теперь компилятор выдает сообщение об ошибке, говорящее:

error: ‘SVector<double, 2u>’ is not a base of 
‘std::vector<SVector<double, 2u>, std::allocator<SVector<double, 2u> > > 

который озадачивает меня. Я могу заменить, очевидно, оскорбляющие линию

unsigned u = Vector::Dim(); 

и что работает, но, очевидно, уродлив, как это жёстко предположения о value_type клиновых ... Спасибо!

ответ

15

Вы получаете доступ к значению value_type через экземпляр переменной, а не тип переменной.

Метод 1 - это работает:

typedef std::vector<Vector> MyVector; 
MyVector v; 
unsigned u = MyVector::value_type::Dim(); 

Метод 2 - или это:

std::vector<Vector> v; 
unsigned u = std::vector<Vector>::value_type::Dim(); 

Если вы TYPEDEF как на метод 1 не жёстко предположения относительно векторного параметра шаблона и вы пишете чистый код.


Edit: Expanded объяснить поведение по этому вопросу в соответствии с просьбой владельца вопрос:

Область разрешения оператора :: имеет более высокую precedence, чем любой другой оператор C++. Это включает в себя доступ члена от объекта . оператора. Таким образом, когда вы пишете что-то вроде:

unsigned u= v.value_type::Dim(); 

это решает следующий код C++:

unsigned u = v.SVector<double, 2>::Dim(); 

и в конечном счете то, что решается первым является SVector<double, 2>::Dim() часть. Это заставит векторный экземпляр, объявленный через переменную v, иметь шаблонный внутренний класс с именем SVector. И потому, что это не произойдет, это приводит к ошибке:

error C2039: 'SVector<double,2>' : is not a member of 'std::vector<_Ty>' 

vector STL должен быть «расширен» для каждого использования этой модели (доступ к value_type корыта переменного экземпляр, а не переменный типа). Это нехорошее решение, так как оно приводит к большому количеству шаблонов и ненужным и недостижимым кодом. Следуя вышеупомянутым решениям, вы избегаете всего этого и можете легко делать то, что хотели.

+0

Большое спасибо, это здорово.Я не знал, что доступ к значению value_type через экземпляр не допускается. Не могли бы вы узнать, почему это не разрешено (что пойдет не так, если это разрешено)? – yungchin 2008-10-13 12:29:37

Смежные вопросы