c++ 在.h文件中声明函数时如何实现.cpp文件中模板的函数[duplicate]

jvidinwx  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(162)

此问题在此处已有答案

(17个答案)
7天前关闭。
我正在学习c++,我正在使用模板,当我使用模板在头文件中声明函数,并在cpp中实现它时,它一直说"undefined reference to void do_something<SomeEnum>()"
.h文件:

enum SomeEnum {
    Yes,
    No,
    Maybe
};

template<SomeEnum someEnum>
void do_something();
void do_something();

.cpp文件:

#include "test.h"
#include "stdio.h"

template<SomeEnum someEnum>
void do_something() {
    printf("%d\n", someEnum);
}

void do_something() {
    printf("...\n");
}

主文件:

...main function
do_something(); // no error
do_something<Yes>(); // thrown an error
eqqqjvef

eqqqjvef1#

通常,模板化函数也在头文件中 defined,尽管如果你坚持声明和定义分开,你可以在头文件中的模板化声明之后使用#include ".cpp"(更多信息请参见Why can templates only be implemented in the header file?)。

xn1cxnb4

xn1cxnb42#

我将此格式用于此类代码

内存.hpp

#ifndef __MEMORY_HPP__
#define __MEMORY_HPP__
    
    class Memory
    {
        public:

        Memory();

        template <uint8_t y, uint8_t x>
        void getMem(uint8_t (&data)[y][x]);

        template <uint8_t y, uint8_t x>
        void setMem(uint8_t (&data)[y][x]);
    };

#define __MEMORY_CPP__
#include "Memory.cpp"
#undef  __MEMORY_CPP__
#endif

内存.cpp

#ifndef __MEMORY_CPP__
#include "Memory.hpp"

    Memory::Memory()
    {
    }

#else

    template <uint8_t y, uint8_t x>
    void Memory::getMem(uint8_t (&data)[y][x])
    {
    }

    template <uint8_t y, uint8_t x>
    void Memory::setMem(uint8_t (&data)[y][x])
    {
    }

#endif

cpp.templatec++.templateseperate.template

相关问题