参数包和函数声明
我有三个文件 - 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
只是函数模板定义的简写 - 这意味着您需要定义您的函数在标头中。
这里有一个解决方案是有效的C++:
// lib.h template <typename... Js>
void funcN(int i, Js... js) {
}
的更多信息:Why can templates only be implemented in the header file?
回答:
在这种情况下,auto...
不会声明带自动类型的参数包。它声明一个未命名的参数,然后是常规省略号,因为编译器允许在elipses之前省略逗号。声明它没有auto
如果你想获得一个常规的可变参数函数
void funcN(int i, ...)
或在头文件合适的模板,如果你想获得真正的参数包
template<typename... TArgs> void function(int i, TArgs... args) {}
以上是 参数包和函数声明 的全部内容, 来源链接: utcz.com/qa/261798.html