C ++重复符号 [英] C++ duplicate symbols

查看:168
本文介绍了C ++重复符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(Mac)

我尝试过命名空间,包括警卫,pragma一次等。

I've tried namespaces, include guards, pragma once, etc.

基本上,这是结构:

CMakeLists.txt

CMakeLists.txt

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

Game / main.cpp

Game/main.cpp

#include "cleanup.h"

//...
cleanup(foobar);

游戏/ rtexture.cpp

Game/rtexture.cpp

#include "cleanup.h"

//...
cleanup(foobar);

cleanup.h

cleanup.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但不能找到一种方法将其包含在多个类中,而不必声明重复的符号。

If anyone asks, I did take this "cleanup.h" from a tutorial but can't find a way to include it in multiple classes without having it declare duplicate symbols.

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

有任何帮助吗?非常感谢。

Any help? Thanks.

推荐答案

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

Explicit function template specialisations are subject to the One Definition Rule, just as regular functions are. Add inline to allow definitions in a header; or define them in a source file, with declarations in the header.

这篇关于C ++重复符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆