【问题标题】:How to include functions with auto return type from header file into multiple cpp files如何将具有自动返回类型的函数从头文件包含到多个 cpp 文件中
【发布时间】:2019-12-27 13:17:17
【问题描述】:

我想以这样的方式定义一个自动返回类型的函数,如果我包含标题,我可以从多个 .cpp 文件中调用它。我有 4 个文件

head.hpp - 函数在哪里

#ifndef HEAD_HPP
#define HEAD_HPP 

auto f();

#endif

head.cpp - 函数声明的地方

#include "head.hpp"

auto f(){
    return [](){
        return 10;
    };
}

test1.cpp - 在哪里使用

#include "head.hpp"
int foo(){
    auto func = f();
    return f();
}

main.cpp - 也用在哪里


#include "head.hpp"
int foo();
int main(){
    auto fu = f();

    return fu() + 5 + foo();
}

所有文件一起编译 我仍然收到错误:

错误:在扣除“auto”之前使用“auto f()”

自动 fu = f();

【问题讨论】:

  • 记住ODR(一个定义规则)。

标签: c++ lambda header auto include-guards


【解决方案1】:

很遗憾,C++ 不能以这种方式工作。

当你在 C++ 中调用函数时:

auto fu=f();

编译器必须知道函数实际返回的离散类型。 auto 不是真正的类型。它只是一个占位符,用于稍后找出类型。

但是这个“后来”永远不会到来。如果编译器看到的只是一个auto 返回类型,编译器就无法确定函数的实际返回类型,因此,程序是错误的,你会得到一个编译错误。

这是 C++ 的一个基本方面,没有变通方法。

【讨论】:

  • 所以要在多个文件中使用该功能,我必须在每个文件中手动重新声明它?
  • 不行,你需要在头文件中声明函数实际返回的内容。在 C++ 中,每个函数总是返回相同的类型。在头文件中声明它。这个返回一个不带参数的 lambda 并返回一个int。在这种情况下,在头文件中声明std::function<int ()> f()(当然包括<functional>,并在其.cpp 文件中定义相同)就足够了。此外,在这种非常特殊的情况下,返回一个普通的函数指针也可以工作。
  • 我似乎无法弄清楚这个 lambda 的函数声明是什么:auto f2= [&drv]<typename T>(T expected)->void
  • 这似乎不是一个 lambda,而是一个模板。一个完全不同的故事,因为templates can only be implemented in header files。如果您不明白这一点,您应该提出一个新问题,并按照help center 中的说明创建minimal reproducible example。有关更多说明,请参阅How to Ask
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 2014-01-04
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多