gpt4 book ai didi

c++ - 参数包和函数声明

转载 作者:行者123 更新时间:2023-11-27 22:42:14 25 4
gpt4 key购买 nike

我有三个文件 - lib.h 带有函数声明,lib.cpp 带有实现和 main.cpp 入口点。它们的内容很简单:

//lib.h
#pragma once

void func1();
void func2();
void funcN();

//lib.cpp
#include "lib.h"

void func1(){}
void func2(){}
void funcN(){}

//main.cpp
#include "lib.h"

int main() {
return 0;
}

我是这样编译的:

$ g++ main.cpp lib.cpp

到目前为止,还不错。但是现在我想在我的一个函数中使用参数包。像这样:

//change in lib.cpp

void funcN(int i, auto... j) {

}

我分别更改了 lib.h 和 main.cpp:

//change in lib.h
void funcN(int, auto...);

//change in main.cpp

int main() {
funcN(1, 2);
return 0;
}

但是现在,当我编译它时

$ g++ main.cpp lib.cpp

我收到此错误消息:

main.cpp:(.text+0x14): undefined reference to `void funcN(int, int, ...)' collect2: error: ld returned 1 exit status

我知道这个错误是因为 auto... 并且我知道如果我将实现放在 lib.h 中我可能会解决它,但是这个看起来很讨厌——在一个文件中有一些实现,而在另一个文件中有其他实现。我想知道,他们在现实世界的实践中是如何做到的。

最佳答案

使用 auto 作为函数参数不是标准 C++。您的代码当前不是有效的 C++。参见 Is auto as a parameter in a regular function a GCC 4.9 extension?了解更多信息。请注意,auto 作为函数参数(连同速记概念语法)尚未添加到 C++20 的工作草案中。

无论如何,以这种方式使用 auto 只是函数模板定义的简写 - 这意味着您需要在 header 中定义您的函数。

这是一个有效的 C++ 解决方案:

// lib.h
template <typename... Js>
void funcN(int i, Js... js) {

}

更多信息:Why can templates only be implemented in the header file?

关于c++ - 参数包和函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com