我有三個文件 - 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
內部實現,但這看起來很討厭 - 在一個文件中實現一些實現,在另一個文件中實現其他實現。我想知道,他們如何在現實世界的實踐中做到這一點。
您可能需要添加一個'-pedantic'標誌。 [這不是標準的C++](http://coliru.stacked-crooked.com/a/d55fca982f36d9ae)。它看起來像是將該功能轉換爲模板的擴展。還有,[模板更好地定義在標題中](https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)。 – StoryTeller