请考虑以下课程:
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
发布于 2016-05-12 11:51:41
这似乎是g++的错误。
我在2015中尝试过您的代码:
构建:1成功,0失败,0最新,0跳过
编辑:我找到了解决办法
#include <iostream>
template <class T>
class MyClass
{
T _id = {0};
public:
decltype(((MyClass<T>*)nullptr)->_id) getId();
};
template <class T>
decltype(((MyClass<T>*)nullptr)->_id) MyClass<T>::getId()
{
return _id;
}
int main()
{
MyClass<int> f;
auto n = f.getId();
std::cout << n << '\n'; // output: 0
}输出:
0发布于 2016-05-12 13:38:55
似乎是GCC Bug 57712。
错误描述中的示例代码:
struct Test {
int method(int value) { return value; }
template <typename T>
auto test(T value) -> decltype(this->method(value));
};
template <typename T>
auto Test::test(T value) -> decltype(this->method(value)) {
return this->method(value);
}https://stackoverflow.com/questions/37185803
复制相似问题