• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

参数包和函数声明

c/c++ 来源:Jacobian 5次浏览

我有三个文件 – 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?


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)