Доступ к typedef из экземпляра - PullRequest
13 голосов
/ 18 июня 2010

Как и в контейнерах stl, почему мы не можем получить доступ к typedef внутри класса из экземпляра класса? Есть ли конкретное понимание этого?


Когда value_type является параметром шаблона, он может помочь в создании более общего кода, если нет необходимости указывать параметры шаблона, как в vector :: value_type

Пример:

class T {
public:
    typedef int value_type;
    value_type i;
};

T t;
T::value_type i; // ok
t.value_type i;  // won't work

Ответы [ 3 ]

10 голосов
/ 13 февраля 2014

Ответ - использовать decltype, чтобы сначала получить класс.Например,

decltype(t)::value_type

Требуется C ++ 11.

Ссылка: https://stackoverflow.com/a/13936644/577704

5 голосов
/ 18 июня 2010

Потому что typedef - это просто синоним другого типа. Это не объект (член класса).

И как @Neil Butterworth упомянул: «Потому что оператор. Является оператором доступа члена».

0 голосов
/ 18 июня 2010

Нет веских причин для использования другого оператора для разрешения области (::), чем для доступа к элементу (.), поскольку он никогда не бывает неоднозначным.Это раздражает, но это так, как язык.


Некоторые языки делают это по-другому, хотя ...

  • C # использует . вместо ::, но вам все равно нужно использовать имя класса при доступе к вложенным типам и статическим членам.
  • D использует ., а <instance>.<static nested type> эквивалентно <type>.<static nested type>.
...