以下情况:
#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“的返回类型?如何像我想做的那样把执行和宣言分开?
发布于 2018-08-20 12:29:08
每个源文件(.cpp文件或.cc文件)都必须独立运行。标准调用这些文件翻译单元,因为程序的行为与--如果所有这些文件都作为单独的单元被翻译成机器语言--并且只有这样,机器代码才会链接到一个程序中。
站在“独立”意味着源文件连同包含在其中的所有文件必须传递所有信息来翻译源文件。如果将masterMethod放在一个源文件中,而main放在另一个源文件中,则编译器不知道masterMethod在编译main时返回哪种类型。
你问题的答案
如何将实现和声明分开,就像我想做的那样?
因此:要么将函数的源代码放在头文件中,要么放弃使用返回类型演绎。如果将源代码放入头文件中,则不需要将其放入类定义中,只要您将其内联声明即可。
发布于 2018-08-20 12:19:09
https://stackoverflow.com/questions/51930288
复制相似问题