/ / Pourquoi nom_table n'est-il pas interchangeable avec decltype () pour cet usage? - c ++ 14, decltype, nomtype

Pourquoi nom_table n'est-il pas interchangeable avec decltype () pour cet usage? - c ++ 14, decltype, nomtype

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 № 1

Il 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 quoi node<T1>::r_sp2node. Est-ce un type ou autre chose? C'est pourquoi le typename 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.