对于给定的用法
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)编译
有人可以解释上述两者之间有什么区别吗?
答案 0 :(得分:1)
第一个例子有两个问题。
decltype(node<T1>::r_sp2node)
中,从内到外阅读,编译器首先需要知道node<T1>::r_sp2node
。它是一种类型,还是其他什么?这就是typename
消歧器存在的原因,这就是错误消息的全部内容。decltype
需要一些表达式,而不是类型。因此,即使您使用typename
,它仍然无法编译。 (举个简单的例子,decltype(int)
甚至不会编译。)要具体回答这个问题,两者之间的区别在于第一个是无效的C ++,第二个是要走的路。