首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与解密和自动的原型失配

与解密和自动的原型失配
EN

Stack Overflow用户
提问于 2016-05-12 11:40:06
回答 2查看 346关注 0票数 14

请考虑以下课程:

代码语言:javascript
复制
class MyClass
{
    int _id;
public:
    decltype(_id) getId();
};

decltype(MyClass::_id) MyClass::getId()
{
    return _id;
}

它编译得很好。

但是,当我利用它创建一个模板类时:

代码语言:javascript
复制
template <class T>
class MyClass
{
    int _id;
public:
    decltype(_id) getId();
};

template <class T>
decltype(MyClass<T>::_id) MyClass<T>::getId()
{
    return _id;
}

我得到:

代码语言:javascript
复制
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)

我可以通过定义类中的主体来修复它:

代码语言:javascript
复制
template <class T>
class MyClass
{
    int _id;
public:
    decltype(_id) getId() { return _id; }
};

后继返回类型也有类似的问题:

代码语言:javascript
复制
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;
}

错误:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2016-05-12 11:51:41

这似乎是g++的错误。

我在2015中尝试过您的代码:

构建:1成功,0失败,0最新,0跳过

编辑:我找到了解决办法

代码语言:javascript
复制
#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
}

输出:

代码语言:javascript
复制
0
票数 2
EN

Stack Overflow用户

发布于 2016-05-12 13:38:55

似乎是GCC Bug 57712

错误描述中的示例代码:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37185803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档