以下情况:
#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;
}
输入上面的简化示例将毫无问题。但是当我尝试将实现和声明分别放在单独的文件(full example here)中时,就会收到错误
main.cpp: error: use of 'decltype(auto) C::masterMethod(int)' before deduction of 'auto'
。将实现直接移到类本身即可解决问题(或在同一文件中实现方法),但是我真的不明白为什么吗?有人可以向我解释为什么编译器什么时候还不知道decltype(auto)的类型,编译器何时开始解析“ auto”的返回类型?我想如何将实现和声明分开?
答案 0 :(得分:1)
如果使用返回类型推导,则不能将声明及其定义分成不同的文件。在编译时,编译器必须能够知道'masterMethod'返回什么。
我认为这类似于以下问题:
答案 1 :(得分:1)
每个源文件(.cpp
文件或.cc
文件)都必须独立存在。该标准称这些文件为翻译单元,因为程序的行为与 -if 相同,所有这些文件都作为独立的单元被翻译成机器语言。机器代码被链接到一个程序中。
“独立”站立意味着源文件及其中包含的所有文件必须传达所有信息以翻译源文件。如果将masterMethod
放在一个源文件中,而将main
放在另一个源文件中,则编译器不知道masterMethod
返回哪种类型的文件来编译main。
问题的答案
我想怎么做一个单独的实现和声明?
是这样的:要么将函数的源代码放在头文件中,要么放弃使用返回类型推导。如果将源代码放入头文件中,则无需将其放在类定义的内部 ,只要将其声明为内联即可。