C++ 模板类绑定到 nodejs

Posted

技术标签:

【中文标题】C++ 模板类绑定到 nodejs【英文标题】:C++ template class binding to nodejs 【发布时间】:2013-07-01 18:02:15 【问题描述】:

我想创建 nodejs 插件包装 C++ 类模板。我将示例类从“Wrapping C++ objects”教程转换为模板。它编译没有错误,但我在使用它时出错。

node: symbol lookup error: /home/me/projects/node-template/build/Release/addon.node: undefined symbol: _ZN8MyObjectIdE4InitEN2v86HandleINS1_6ObjectEEE

插件.cc:

<...>
void InitAll(Handle<Object> exports) 
    MyObject<double>::Init(exports);

<...>

我的对象.cc:

<...>
template <typename T>
MyObject<T>::MyObject() ;

template <typename T>
MyObject<T>::~MyObject() ;

template <typename T>
void MyObject<T>::Init(Handle<Object> exports) 
<...>

我的对象.h:

<...>
template <typename T>
class MyObject : public node::ObjectWrap 
    public:
        static void Init(v8::Handle<v8::Object> exports);

    private:
        MyObject();
        ~MyObject();

        static v8::Handle<v8::Value> New(const v8::Arguments& args);
        static v8::Handle<v8::Value> PlusOne(const v8::Arguments& args);
        T counter_;
;

【问题讨论】:

【参考方案1】:

C++ 模板排除了单独的编译单元,至少您在此处所做的那样。你的addon.cc 想要一个MyObject&lt;double&gt;,并假设它将在稍后定义(并在运行时动态链接期间解决)。但是myobject.cc 不知道你想要一个double-instantiated MyObject,所以编译器在生成myobject.o 时不会生成它。

为了解决您的困境,只需将myobject.cc的内容放入myobject.h即可。即把MyObject定义放到你的头文件中;不要将其作为单独的编译单元。

【讨论】:

它是这样工作的,但 definition 不应该在 .c/cc 文件和 .h 中的类/函数原型中,不是吗?我的意思是您的解决方案有效,但它是正确的方式吗? 没关系,我找到了答案:***.com/questions/5612791/c-template-and-header-files

以上是关于C++ 模板类绑定到 nodejs的主要内容,如果未能解决你的问题,请参考以下文章

TSLint - 您只能绑定到公共类成员(模板使用公共)

《c++从0到99》 六 模板

《c++从0到99》 六 模板

《c++从0到99》 六 模板

C++将模板的声明和定义放置在同一个头文件里

将模板类从 C++ 库导出到 VB.NET 和 C#