首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导入/导出C++模板类

如何导入/导出C++模板类
EN

Stack Overflow用户
提问于 2018-02-03 18:45:09
回答 1查看 384关注 0票数 0

当模板类在共享库和静态库中编译时,我如何使用和消费它?

例如,我有一个库项目:

代码语言:javascript
复制
/// Lib/Config.hpp
// if building a shared library
#ifdef LIB_BUILD_DLL
#  define LIB_API          __declspec(dllexport)
#  define LIB_TEMPLATE_API __declspec(dllexport)
#  define LIB_EXTERN
// exe projects use the shared library
#elif defined(LIB_DLL)
#  define LIB_API          __declspec(dllimport)
#  define LIB_TEMPLATE_API
#  define LIB_EXTERN       extern
// if building a static library, and exe projects use the static library
#else
#  define LIB_API
#  define LIB_TEMPLATE_API
#  define LIB_EXTERN
#endif
/// End of Lib/Config.hpp

/// Lib/Location.hpp
template<typename T>
LIB_EXTERN class Vector2;

class LIB_API Location
{
public:
     Vector2<float> point;
};
/// End of Lib/Location.hpp

/// Lib/Vector2.hpp
template<typename T>
LIB_EXTERN class LIB_TEMPLATE_API Vector2
{
public:
    template <typename U>
    explicit Vector2(const Vector2<U>& vector)
    {
        x = vector.x;
        y = vector.y;
    }

    Vector2<T> operator -(const Vector2<T>& right)
    {
        return Vector2<T>(x - right.x, y - right.y);
    }

    T x;
    T y;
};
typedef Vector2<float> Vector2f;
/// End of Lib/Vector2.hpp

和一个exe主项目:

代码语言:javascript
复制
#include "Lib/Config.hpp"
#include "Lib/Location.hpp"
#include "Lib/Vector2.hpp"

class Application
{
public:
    Location location_;
    Vector2<float> point_;
    Vector2f float_point_;
}

我想问的是,我是否正确地使用了LIB_EXTERN

如何将Vector2f对象传递给复制构造函数Vector2(const Vector2<U>& vector)

EN

回答 1

Stack Overflow用户

发布于 2018-02-03 19:40:42

通常不会导出模板函数或类。它们针对每个翻译单元进行编译,并在必要时由链接器进行清理。只需包含.hpp文件,就可以在需要的地方编译必要的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48596465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档