gpt4 book ai didi

C++ 重复符号

转载 作者:可可西里 更新时间:2023-11-01 18:15:51 31 4
gpt4 key购买 nike

(苹果电脑)

我尝试过命名空间,包括 guards、pragma once 等。

基本上,这是结构:

CMakeLists.txt

add_executable(Game Game/main.cpp Game/rtexture.cpp)

游戏/main.cpp

#include "cleanup.h"

//...
cleanup(foobar);

游戏/rtexture.cpp

#include "cleanup.h"

//...
cleanup(foobar);

清理.h

//various includes

template<typename T, typename... Args>
void cleanup(T *t, Args&&... args){
//Cleanup the first item in the list
cleanup(t);
//Recurse to clean up the remaining arguments
cleanup(std::forward<Args>(args)...);
}
/*
* These specializations serve to free the passed argument and also provide the
* base cases for the recursive call above, eg. when args is only a single item
* one of the specializations below will be called by
* Cleanup(std::forward<Args>(args)...), ending the recursion
* We also make it safe to pass nullptrs to handle situations where we
* don't want to bother finding out which values failed to load (and thus are null)
* but rather just want to clean everything up and let cleanup sort it out
*/
template<>
void cleanup<SDL_Window>(SDL_Window *win){
if (!win){
return;
}
SDL_DestroyWindow(win);
}
template<>
void cleanup<SDL_Renderer>(SDL_Renderer *ren){
if (!ren){
return;
}
SDL_DestroyRenderer(ren);
}
template<>
void cleanup<SDL_Texture>(SDL_Texture *tex){
if (!tex){
return;
}
SDL_DestroyTexture(tex);
}
template<>
void cleanup<SDL_Surface>(SDL_Surface *surf){
if (!surf){
return;
}
SDL_FreeSurface(surf);
}

如果有人问,我确实从教程中获取了这个“cleanup.h”,但无法找到将其包含在多个类中而不声明重复符号的方法。

Home at cruz45488-y19-MBA13-12 in ~/desktop/sdlworkspace/tmp
$ make
Linking CXX executable Game
duplicate symbol __ZN5RUtil7cleanupI10SDL_WindowJEEEvPT_DpOT0_ in:
CMakeFiles/Game.dir/Game/main.cpp.o
CMakeFiles/Game.dir/Game/rtexture.cpp.o
duplicate symbol __ZN5RUtil7cleanupI12SDL_RendererJEEEvPT_DpOT0_ in:
CMakeFiles/Game.dir/Game/main.cpp.o
CMakeFiles/Game.dir/Game/rtexture.cpp.o
duplicate symbol __ZN5RUtil7cleanupI11SDL_TextureJEEEvPT_DpOT0_ in:
CMakeFiles/Game.dir/Game/main.cpp.o
CMakeFiles/Game.dir/Game/rtexture.cpp.o
duplicate symbol __ZN5RUtil7cleanupI11SDL_SurfaceJEEEvPT_DpOT0_ in:
CMakeFiles/Game.dir/Game/main.cpp.o
CMakeFiles/Game.dir/Game/rtexture.cpp.o

有什么帮助吗?谢谢。

最佳答案

显式函数模板特化遵循单一定义规则,就像常规函数一样。添加 inline 以允许在标题中定义;或在源文件中定义它们,并在 header 中声明。

关于C++ 重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29946517/

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