Pour un usage donné
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) génère l'erreur du compilateur:
error: missing "typename" prior to dependent type name
"node<T1>::r_sp2node"
alors que (2) compile
Quelqu'un peut-il expliquer quelle est la différence entre les deux précédents?
Réponses:
1 pour la réponse № 1Il y a deux problèmes avec le premier exemple.
- Dans
decltype(node<T1>::r_sp2node)
, en lisant à l'envers, le compilateur doit d'abord savoir quoinode<T1>::r_sp2node
. Est-ce un type ou autre chose? C'est pourquoi letypename
L’homonymie existe, et c’est en quoi consiste le message d’erreur. - Le deuxième problème est que
decltype
attend une expression, pas un type. Donc même si vous avez utilisétypename
, il ne serait toujours pas "compiler. (Par exemple,decltype(int)
ne sera même pas compiler.)
Pour répondre précisément à la question, la différence entre les deux réside dans le fait que le premier n’est pas valide en C ++ et que le second est la voie à suivre.