C++ 推导的返回类型在定义之前不能使用

Sib*_*umi 4 c++ types c++17

计算器.h

class Calculator {
    Calculator();
    template<typename... Args>
    static auto add(Args... args);
};
Run Code Online (Sandbox Code Playgroud)

计算器.cpp

#include "Calculator.h"

Calculator::Calculator() {}

template<typename... Args>
auto Calculator::add(Args... args) {
    return (args + ... + 0);
}
Run Code Online (Sandbox Code Playgroud)

主程序

#include <iostream>
#include "Calculator.h"

int main(){
    Calculator cal;
    std::cout<< cal.add(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)

具有推导返回类型的函数“add<int, int, int>”在定义之前不能使用

如果我将该add()方法移至头文件中,则不会出现错误。我缺少什么?

eer*_*ika 5

我缺少什么?

错误消息解释了这一点:您试图在定义函数之前使用推导的返回类型。这是不允许的1Calculator::add为了澄清起见,您在 中调用该函数main,但该函数Calculator::add在函数调用之前未在同一翻译单元中定义。事实上,它根本不是在同一个翻译单元中定义的。

您需要:

  1. 在调用之前定义函数,这就是您在标头中定义函数时所做的事情,
  2. 或者显式声明返回类型而不进行自动推导...但是,如果使用此方法,示例程序中仍然存在另一个不相关但类似的问题:模板通常无法在定义之前实例化。1. 方法也解决了这个问题。

1这是不允许的,因为返回类型是根据函数定义中的 return 语句推导出来的。如果没有函数定义,那么编译器就无法确定返回类型。