如何为班级成员使用自动类型扣除?例如,以下代码
struct A
{
auto foo(); // foo is defined in another file
};
int main()
{
A a;
a.foo();
}
其中foo
的返回类型为auto
会导致以下错误:
error: function 'foo' with deduced return type cannot be used before it is defined
a.foo();
^
错误是可以理解的,因为编译在不知道其定义的情况下无法知道foo
的返回类型。
我的问题是,如果有任何变通方法或某种编程模式来规避问题,那么自动返回类型不能用于类成员函数,以防函数的声明和定义被分开。 / p>
答案 0 :(得分:11)
如果要使用返回类型扣除,则不能将声明和定义分隔为不同的文件(除非每个人都包含两者)。除了使用实际类型之外,没有其他解决方法。
当C ++去编译调用func
的代码时,它必须能够知道当时,它将返回什么。如果没有在该翻译单元中定义,编译器就无法知道将返回什么。因此,编译器无法编译该代码。而C ++的编译模型不允许它以这种方式使用来自其他翻译单元的信息。
你可以做的最好的事情就是等待模块,这可能会解决这个问题。
不要将返回类型推断视为永远不必编写返回类型的方法。它是一种功能,适用于返回类型难以编写的情况,其中最合理的编写方式是decltype(expr)
,而expr
是您要返回的确切表达式。这些情况通常都是模板代码,无论如何都必须进入标题。如果返回类型对您来说简单明了,那么不就没有理由把它放在那里。默认情况下不要使用返回类型扣除。