首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动扣减前解密( auto ) <func>的使用

自动扣减前解密( auto ) <func>的使用
EN

Stack Overflow用户
提问于 2018-08-20 11:59:51
回答 2查看 1.9K关注 0票数 1

以下情况:

代码语言:javascript
复制
#include <stdint.h>

class C
{
public:
    C()=default;
    ~C()=default;
    template<uint8_t> struct integconst
    {
    };

    int m1(integconst<8>);
    int m2(integconst<8>);
    decltype(auto) masterMethod(int opMode);
private:
};

int C::m1(integconst<8>) {return 1;}
int C::m2(integconst<8>) {return 2;}

decltype(auto) C::masterMethod(int opMode)
{
    switch(opMode)
    {
    case 1:
            return m1(integconst<sizeof(uintptr_t)>{}); break;
    case 2:
            return m2(integconst<sizeof(uintptr_t)>{}); break;
    default:
            return m1(integconst<sizeof(uintptr_t)>{}); break;
    }
}

int main()
{
    C obj;
    int bla=obj.masterMethod(1);
    return 0;
}

将上述简化的例子放在一起不会有任何问题。但是,当我试图在单独的文件(这里是完整的例子)中分离实现和声明时,就会得到错误。

main.cpp: error: use of 'decltype(auto) C::masterMethod(int)' before deduction of 'auto'。将实现直接移动到类本身可以解决问题(或者在同一个文件中实现方法),但我真的不明白为什么?有谁能解释一下为什么编译器还不知道解密类型(Auto)的类型,敬请注意,编译器什么时候开始解析"auto“的返回类型?如何像我想做的那样把执行和宣言分开?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-20 12:29:08

每个源文件(.cpp文件或.cc文件)都必须独立运行。标准调用这些文件翻译单元,因为程序的行为与--如果所有这些文件都作为单独的单元被翻译成机器语言--并且只有这样,机器代码才会链接到一个程序中。

站在“独立”意味着源文件连同包含在其中的所有文件必须传递所有信息来翻译源文件。如果将masterMethod放在一个源文件中,而main放在另一个源文件中,则编译器不知道masterMethod在编译main时返回哪种类型。

你问题的答案

如何将实现和声明分开,就像我想做的那样?

因此:要么将函数的源代码放在头文件中,要么放弃使用返回类型演绎。如果将源代码放入头文件中,则不需要将其放入类定义中,只要您将其内联声明即可。

票数 2
EN

Stack Overflow用户

发布于 2018-08-20 12:19:09

如果使用的是返回类型扣减,则不能将声明及其定义分隔到不同的文件中。编译时,编译器必须能够知道'masterMethod‘返回的是什么。

我认为这与以下问题类似:

类成员上下文中的返回类型

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51930288

复制
相关文章

相似问题

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