Почему typename не взаимозаменяемо с decltype() для этого использования?

Для данного использования

template<typename T1> 
class node{

public:
using sp2node = shared_ptr<node<T1>>;
using r_sp2node = shared_ptr<node<T1>>&;

public:
r_sp2Node getN();

private:
sp2node N;

};

(1)

template<typename T1> decltype(node<T1>::r_sp2node) node<T1>::getN(){

       return N;

}

(2)

template<typename T1> typename node<T1>::r_sp2node node<T1>::getN(){

       return N;

}

(1) генерирует ошибку компилятора:

error: missing 'typename' prior to dependent type name 
    'node<T1>::r_sp2node'

тогда как (2) компилируется

Может кто-нибудь объяснить, в чем разница между двумя выше?

1 ответ

Решение

В первом примере есть две ошибки.

  • В decltype(node<T1>::r_sp2node)читая наизнанку, компилятору сначала нужно знать, что node<T1>::r_sp2node, Это тип или что-то еще? Вот почему typename существует двусмысленность, и именно в этом и заключается сообщение об ошибке.
  • Вторая проблема заключается в том, что decltype ожидает некоторое выражение, а не тип. Так что даже если вы использовали typenameэто все равно не скомпилируется. (В качестве простого примера decltype(int) даже не скомпилирует.)

Чтобы конкретно ответить на вопрос, разница между ними заключается в том, что первый не является допустимым C++, а второй - подходящим.

Другие вопросы по тегам