How can I get sizeof a vector::value_type?
c++, c++11, sizeof, value-type, vector
Solution
3.4.3 Qualified name lookup [basic.lookup.qual]
1 The name of a class or namespace member or enumerator can be referred to after the :: scope resolution operator (5.1) applied to a nested-name-specifier that denotes its class, namespace, or enumeration. If a :: scope resolution operator in a nested-name-specifier is not preceded by a decltype-specifier, lookup of the name preceding that :: considers only namespaces, types, and templates whose specializations are types. If the name found does not designate a namespace or a class, enumeration, or dependent type, the program is ill-formed.
In this case, you are accessing a `type` member from the class template specialization `std::vector<uint>`, and you need to do it by writing:
std::vector<uint>::value_type
In case you are actually inside templated code and want to e.g. access the same nested type, you need to prefix it with the keyword `typename` like this:
typename std::vector<T>::value_type
In C++11, you can use `sizeof(decltype(vecs)::value_type)` or also `sizeof(decltype(vecs.back()))`, the latter is convenient if you don't know the precise name of the type but know how to access them through a member function like `back()`.
Note: as pointed out by @Casey in the comments, `decltype` requires stripping references in order to get the type itself, but for sizeof purposes that doesn't matter.
Problem
I want to get `sizeof` of the type that is contained in a vector. Here is what I tried: ``` #include <iostream> #include <vector> int main() { std::vector<uint> vecs; std::cout << sizeof(vecs.value_type) << std::endl; return 0; } ``` From my understanding this should be correct. However, when compiling with GCC 4.8.1 this is what I get: ``` test-sizeof.cpp: In function ‘int main()’: test-sizeof.cpp:7:27: error: invalid use of ‘std::vector<unsigned int>::value_type’ std::cout << sizeof(vecs.value_type) << std::endl; ^ ``` What am I doing wrong? How can I get the size of the contained type?