我正在为我的大程序创建一个目标文件,在这个程序中我使用了一个定义了自定义删除器的unique_ptr
类型,所以我这样编译我的文件:
g++ -std=c++20 tmp.cpp -c -Wall
代码如下所示:
#include <memory>
using specialptr = std::unique_ptr<int, decltype([](int *f) {
delete f;
})>;
specialptr fun(){
return specialptr{new int};
}
这将生成以下警告:
tmp.cpp:12:12: warning: ‘specialptr fun()’ defined but not used [-Wunused-function]
12 | specialptr fun(){ return specialptr{new int};}
|
当我将此目标文件与调用该函数的main.cpp
链接时,我得到以下错误:
In file included from main.cpp:1:
tmp.h:19:12: warning: ‘specialptr fun()’ used but never defined
19 | specialptr fun();
| ^~~
/usr/bin/ld: /tmp/ccnuTTGC.o: in function `main':
main.cpp:(.text+0x4c): undefined reference to `fun()'
collect2: error: ld returned 1 exit status
这是怎么回事?当我把返回值从unique_ptr
改为普通指针时,我的代码可以正常工作。但凭直觉,我定义了类型和函数,并在头文件中进行了声明。
g是版本:g(Ubuntu 11.3.0- 12.04版本)11.3.0
2条答案
按热度按时间shyt4zoc1#
你可以使用对象类型作为删除器,在这种情况下,你不需要每次创建
std::unique_ptr
时都设置它。cnjp1d6j2#
lambda的
decltype
对于每个翻译单元是不同的。您可以改为执行以下操作: