gpt4 book ai didi

c++:类声明和定义在 header 内分离导致重复符号

转载 作者:太空狗 更新时间:2023-10-29 20:30:15 25 4
gpt4 key购买 nike

如果类是模板类,我通常只在头文件中定义它们。- 如果是这种情况,我仍然喜欢在头文件中拆分声明和定义:

template<class T>
class Foo
{
public:

Foo();

void fooFunc();
};


template<class T>
Foo<T>::Foo()
{

}

template<class T>
void Foo<T>::fooFunc()
{

}

该代码也可以编译。但是如果我删除模板:

class Foo
{
public:

Foo();

void fooFunc();
};


Foo::Foo()
{

}

void Foo::fooFunc()
{

}

我收到 Foos 函数的重复符号错误。我非常确定这应该有效,但很惊讶它没有。这是预期的行为吗?如果我在定义之前添加内联,它也可以工作。

最佳答案

是的,这是预期的行为。

内联函数应该被单独编译到每个调用点,所以重复是没有问题的。对于模板函数,编译器会在目标文件中标记它们,以便链接器基本上忽略重复项,因为很难预测模板将在何处实例化或不实例化。

但是常规函数应该只定义一次。如果您在头文件中定义一个,它会被编译到包含该头文件的每个翻译单元中,如果您有多个包含该函数拷贝的目标文件,则会在链接时导致“重复符号”错误。

关于c++:类声明和定义在 header 内分离导致重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584589/

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