gpt4 book ai didi

c++ - 使用 g++ 编译时静态函数的模板特化

转载 作者:太空狗 更新时间:2023-10-29 20:44:36 24 4
gpt4 key购买 nike

为什么以下代码在编译时不起作用:

$ g++ temp_main.cpp temp_spec.cpp/tmp/ccirjc3Y.o:temp_spec.cpp:(.text+0x100): multiple definition of `my::say()'/tmp/ccSo7IVO.o:temp_main.cpp:(.text$_ZN2myILi0EE3sayEv[my::say()]+0x0):first defined here collect2: ld returned 1 exit status

I'm trying to have specialization of static function only when usingparamteter 0.

temp_gen.h:

#ifndef temp_gen_h
#define temp_gen_h

#include <iostream>

template<int N>
struct my
{
static void say();
};

template<int N>
void my<N>::say()
{
std::cout << "generic " << N << std::endl;
}

#endif

temp_spec.h:

#ifndef temp_spec_h
#define temp_spec_h

#include <iostream>

#include "temp_gen.h"

template<>
void my<0>::say()
{
std::cout << "specialized " << 0 << std::endl;
}

#endif

temp_spec.cpp:

#include "temp_spec.h"

temp_main.cpp:

#include "temp_gen.h"

int main(int argc, char* argv[])
{
my<0>::say(); //should say "specialized 0"
my<1>::say(); //should say "generic 0"
}

最佳答案

在您的 main.cpp 中,您没有专门化模板类,这是因为您没有包含 temp_spec.h

正如 Vaughn Cato 指出的(见评论),您应该将专用方法(不再是模板方法)的定义移动到temp_spec.cpp

我认为(但我不是这方面的专家)你应该总是将特化直接放在通用模板的下面(在同一个头文件中),因为无论何时你包含它,你也想要要定义专门的,否则发生此类错误时您会感到困惑。但是,您可以只在 temp_gen.h 的底部包含 temp_spec.h

此外,您不需要模板头文件的 .cpp 文件,因为永远不会有任何代码需要单独编译(模板类总是在使用它的其他 .cpp 文件中编译,并且我认为链接时会删除重复项,这会再次导致链接时出现问题,在一种情况下您没有专门化它,有一次您做了 ) [本段仅适用于通用模板类,不适用于(完全)专用类,因为它们需要它们自己的编译单元中的一些代码,请参阅上面的注释和编辑。]

关于c++ - 使用 g++ 编译时静态函数的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12860175/

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