4

在我们的项目中,我们有这样的东西:

struct PointI
{
  // methods for getting, setting and calculating some point stuff
private:
  int x;
  int y;
};

struct PointD
{
  // methods for getting, setting and calculating some point stuff
private:
  double x;
  double y;
};

我建议将其更改为类似的内容:

template<typename T>
struct Point
{
  // methods for gettig, setting and calculating some point stuff
private:
  T x;
  T y;
};

typedef Point<int> PointI;
typedef Point<double> PointD;
typedef Point<float> PointF;

但这被拒绝了,我被告知:“这种方法存在一个问题 - C++ 符号修改和导出。在导出的符号(使用它们的 API)中使用模板时,模板太长了,无法导出模板。”

这个论点是否强大到允许大量代码重复?

4

3 回答 3

4

你的老板(或其他人)可能是对的。如果您编写的库应该可以从 C++ 以外的其他语言中使用,通常最好只用 C 编写接口。

当然,你仍然可以在内部使用模板,只是不要暴露它们。

于 2010-12-04T10:15:38.920 回答
1

没有办法导出模板

这仅适用于 C 链接(即,如果您在导出时使用 extern "C")。从共享库中导出模板类没有技术问题——想想从 C++ 运行时库中导出的 STL 类。

确实,由于 CPP 的名称修改未标准化,导出类的客户端将不得不使用与您相同的编译器(通常是相同的编译器版本)——但这在封闭环境中可能是可以接受的。顺便说一句,这就是您经常必须在安装新软件之前安装 Microsoft 的 Visual C++ 200X Redistributable 软件包的原因。MS 可再发行包专门针对 Windows 平台上的 CPP 运行时库解决了这个问题。

于 2010-12-04T12:51:44.797 回答
0

有导出模板的方法,如果你用的是Visual Studio,可以签出__declspec(dllimport/dllexport),非常强大。我不知道其他编译器是否提供此功能。但是,如果您不导出与 C 兼容的接口,那么您基本上是在强迫用户使用与您相同的编译器,至少是相同的供应商,如果不是相同的确切模型。

于 2010-12-04T12:55:45.970 回答