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.
std::vector<uint>::value_type
– Suhsizeof(std::vector<uint>::value_type)
orsizeof(decltype(vecs)::value_type)
. – Uigursizeof(vecs[0])
? – Bein