Почему 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++, а второй - подходящим.