gpt4 book ai didi

c++ - 带有模板参数的共享库

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:18 25 4
gpt4 key购买 nike

使用以下文件创建共享库

example.cpp
#include <iostream>
template <typename T>
T Max (T & a, T & b)
{
return a < b ? b:a;
}

我试图在我的代码中使用上面的库

test.cpp
#include <stdio.h>
#include <iostream>
using namespace std;

template int Max <int> (int & a, int & b);
template double Max <double> (double & a, double & b);

int main ()
{
int i = 39;
int j = 20;
cout << "Max(i, j): " << Max(i, j) << endl;
double f1 = 13.5;
double f2 = 20.7;
cout << "Max(f1, f2): " << Max(f1, f2) << endl;
return 0;
}

当我编译上面的代码时,得到以下错误

test.cpp:4: error: explicit instantiation of non-template ‘int Max’
test.cpp:4: error: expected ‘;’ before ‘<’ token
test.cpp:5: error: explicit instantiation of non-template ‘double Max’
test.cpp:5: error: expected ‘;’ before ‘<’ token
test.cpp: In function ‘int main()’:
test.cpp:11: error: ‘Max’ was not declared in this scope*

最佳答案

我意识到这是一个微不足道的例子,更多的是出于学术目的。否则我会建议放弃整个事情并只使用 std::max从一开始。标准库提供了大量明确说明和测试的功能供使用;除非你有充分的理由重新发明轮子,否则请使用它。

如果你真的想在头文件中提供函数的模板声明,并在共享对象库中提供所述模板的实现,你可以使用显式实例化来实现,它看来你正在尝试。但是,您的尝试似乎是将 said-same 放在错误的模块中。

一种方法如下:

example.hpp

#ifndef MYLIB_EXAMPLE_HPP
#define MYLIB_EXAMPLE_HPP

// define forward declaration here. no implementation
template<class T> T Max(T lhs, T rhs);

#endif

example.cpp

#include "example.hpp"

// provide implementation here
template<class T>
T Max(T lhs, T rhs)
{
return (lhs < rhs) ? rhs : lhs;
}

// explicit instantiations
template int Max<int>(int,int);
template double Max<double>(double,double);

图书馆就是这样。使用 clang 构建的示例是:

clang++ -std=c++11 -Wall -Wextra -pedantic -fPIC -shared -o libexample.so example.cpp

生成的共享对象库公开了以下符号:

nm libexample.so

0000000000000f50 T __Z3MaxIdET_S0_S0_
0000000000000f20 T __Z3MaxIiET_S0_S0_
U dyld_stub_binder

如您所见,它们在库中。关于将使用该库的测试程序:

测试.cpp

#include <iostream>
#include "example.hpp"

int main ()
{
int i = 39;
int j = 20;

std::cout << "Max(i, j): " << Max(i, j) << std::endl;

double f1 = 13.5;
double f2 = 20.7;

std::cout << "Max(f1, f2): " << Max(f1, f2) << std::endl;

return 0;
}

我们按如下方式构建它(假设库在本地文件夹中):

clang++ -std=c++11 -Wall -Wextra -pedantic -L. -o test -lexample test.cpp

生成的程序 test 产生以下输出:

Max(i, j): 39
Max(f1, f2): 20.7

老实说,这样做并没有太大的值(value),因为任何未在显式列表中提供的 Max 的 future 用法都会导致链接器错误(除非那是意图,在这种情况下,它会完全按照您的要求进行操作)。

关于c++ - 带有模板参数的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728946/

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