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

时间:2019-12-17 19:47:44

标签: c++ types c++17

Calculator.h

export const useGeoFireDatabaseQuery = (coordinates) => {

  const [data, setData] = useState([])
  const geoQuery = geoFire.query({
    center: coordinates,
    radius: 2
  });

  useEffect(()=>{
    if (coordinates != null) {
    geoQuery.on("key_entered",  (key, location, distance)=> {
      firebase.database().ref('data').child(key).on('value', (snapshot) => {
     const dataList=[]
      snapshot.forEach(doc => {
        dataList.push(doc.val())
       })

         setData(dataList)
      })

    })
    }
    },[])
  console.log('Data',data)
  return data
}

Calculator.cpp

class Calculator {
    Calculator();
    template<typename... Args>
    static auto add(Args... args);
};

main.cpp

#include "Calculator.h"

Calculator::Calculator() {}

template<typename... Args>
auto Calculator::add(Args... args) {
    return (args + ... + 0);
}
  

具有推定返回类型的函数'add '在定义之前不能使用

如果我将#include <iostream> #include "Calculator.h" int main(){ Calculator cal; std::cout<< cal.add(1,2,3); } 方法移到头文件中,则没有错误。我想念什么?

1 个答案:

答案 0 :(得分:1)

  

我缺少什么?

错误消息对此进行了解释:您试图在定义函数之前使用推导的返回类型。那是不允许的 1 。为了清楚起见,您在Calculator::add中调用了函数main,但是在调用函数之前,未在同一转换单元中定义函数Calculator::add。实际上,它根本不在同一翻译单元中定义。

您需要:

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

1 不允许这样做,因为根据函数定义中的return语句推导返回类型。如果没有函数定义,则编译器将无法找出返回类型。