【发布时间】:2023-03-12 17:28:01
【问题描述】:
考虑以下类:
class MyClass
{
int _id;
public:
decltype(_id) getId();
};
decltype(MyClass::_id) MyClass::getId()
{
return _id;
}
它编译得很好。
但是,当我用它制作模板类时:
template <class T>
class MyClass
{
int _id;
public:
decltype(_id) getId();
};
template <class T>
decltype(MyClass<T>::_id) MyClass<T>::getId()
{
return _id;
}
我明白了:
test.cpp:10:27: error: prototype for 'decltype (MyClass<T>::_id) MyClass<T>::getId()' does not match any in class 'MyClass<T>'
decltype(MyClass<T>::_id) MyClass<T>::getId()
^
test.cpp:6:19: error: candidate is: decltype (((MyClass<T>*)(void)0)->MyClass<T>::_id) MyClass<T>::getId()
decltype(_id) getId();
^
为什么会这样?
为什么会有不同的类型
decltype (MyClass<T>::_id) MyClass<T>::getId()decltype (((MyClass<T>*)(void)0)->MyClass<T>::_id)
我可以通过在类中定义主体来解决它:
template <class T>
class MyClass
{
int _id;
public:
decltype(_id) getId() { return _id; }
};
尾随返回类型也有类似的问题:
template <class T>
class MyClass
{
int _id;
public:
auto getId() -> decltype(_id);
};
template <class T>
auto MyClass<T>::getId() -> decltype(MyClass<T>::_id)
{
return _id;
}
错误:
test.cpp:10:6: error: prototype for 'decltype (MyClass<T>::_id) MyClass<T>::getId()' does not match any in class 'MyClass<T>'
auto MyClass<T>::getId() -> decltype(MyClass<T>::_id)
^
test.cpp:6:10: error: candidate is: decltype (((MyClass<T>*)this)->MyClass<T>::_id) MyClass<T>::getId()
auto getId() -> decltype(_id);
^
decltype (MyClass<T>::_id) MyClass<T>::getId()decltype (((MyClass<T>*)this)->MyClass<T>::_id) MyClass<T>::getId()
g++ 5.3.0
【问题讨论】:
-
在声明中简单地使用
decltype( MyClass<T>::_id )而不是decltype( _id )为我修复了它。 (也是 gcc 5.3.0)。我不知道如何解释这个证据。基本上,只要确保声明和定义尽可能相似——即在两者中都使用decltype( MyClass<T>::_id )
标签: c++ templates c++14 auto decltype