Ответ 1
Ответ заключается в использовании decltype
, чтобы сначала получить класс. Например.
decltype(t)::value_type
Требуется С++ 11.
Ссылка: fooobar.com/questions/513796/...
Как и в контейнерах 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
Ответ заключается в использовании decltype
, чтобы сначала получить класс. Например.
decltype(t)::value_type
Требуется С++ 11.
Ссылка: fooobar.com/questions/513796/...
Поскольку typedef является просто синонимом другого типа. Это не объект (член класса).
И как @Neil Butterworth упомянул: "Потому что оператор. является оператором доступа к члену".
Нет никакой веской причины использовать другой оператор для разрешения области (::
), чем для доступа к члену (.
), поскольку он никогда не является двусмысленным. Это раздражение, но это так же, как язык.
Некоторые языки делают это по-другому, хотя...
.
вместо ::
, но вам все равно нужно использовать имя класса при доступе к вложенным типам и статическим членам..
, а <instance>.<static nested type>
эквивалентен <type>.<static nested type>
.