Вы получаете доступ к типу 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();
Если вы вводите определение, как в методе 1, вы не вводите жесткие предположения для параметра векторного шаблона и пишете чистый код.
Редактировать: Расширено, чтобы объяснить поведение этой проблемы в соответствии с запросом владельца вопроса:
Оператор разрешения области ::
имеет более высокий приоритет , чем любой другой оператор 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>'
STL vector
необходимо будет "расширять" для каждого использования этого шаблона (доступ к экземпляру переменной через тип_значения, а не к типу переменной). Это не очень хорошее решение, так как оно приводит к большому количеству шаблонов и ненужному и не поддерживаемому коду . Следуя вышеупомянутым решениям, вы избегаете всего этого и можете легко делать то, что хотели.