gpt4 book ai didi

c++ - 在库中使用模板

转载 作者:行者123 更新时间:2023-11-28 05:47:05 25 4
gpt4 key购买 nike

设置

啊.h

void foo(void);

a.cc

#include "a.h"
void foo(void) { /* do something */ }

这些都被编译到一个名为 libA 的共享库中

b.h

#include "a.h"

void bar(void);
template <typename T>
void baz(void)
{
foo();
}

b.cc

#include "b.h"

void bar(void)
{
foo();
}

这两个被编译到共享库libB , 并链接到 libA .

现在我编写我的主程序,它链接到 libB , 但不是 libA .

ma​​in.cc

#include "b.h"

int main(void)
{
bar(); // Okay, compiles
baz<int>(); // Undefined symbol *foo()*, referenced from void bar<int>() in main-(...)
}

解释

我有点明白,为什么这会引发错误。在 libB我有一个模板声明,可用于实例化函数,尽管它没有在 libB 中实例化任何函数。本身。

main.cc但是它实例化了函数 void bar<int>(void) ,然后将其放入 main.cc 的目标代码中, 哪里找不到 libA s foo()函数并抛出链接错误。

谁会想到?如果我链接 main.cc反对libB同样,它工作得很好。

但是我的问题是:我如何才能有效地使用模板,而不必链接到原始库和/或不必实例化 bar<>() 的每个版本? ,我打算使用什么?


编辑 - 聊天说明

目标是允许 libB 提供模板,而不需要在 libB 中显式实例化,并且客户端不需要耦合到 libB 的实现细节。

最佳答案

模板定义是您的库(在本例中为 libB)的公共(public)接口(interface)的一部分。

将 libB 的客户端与其实现细节(在这种情况下:对 libA 的依赖)分离的唯一方法是通常的:不要公开它们。将它们隐藏在 libB 中。如果它们在 b.h 中可见,则它们是公共(public)界面的一部分。

在这种情况下,简单的解决方案是在 libB 中提供一个(非模板,非内联)函数,它抽象了对 libA 的依赖:


// b.h
void do_fooish_things();

template <typename T>
void baz(void)
{
do_fooish_things();
}

// b.cc
#include <libA/a.h>
void do_fooish_things() {
// hidden implementation detail
libA::foo();
}

关于c++ - 在库中使用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36017437/

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