Доступ к typedef из экземпляра

Как и в контейнерах 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

Ответ 1

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

decltype(t)::value_type

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

Ссылка: fooobar.com/questions/513796/...

Ответ 2

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

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

Ответ 3

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


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

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