我知道这个问题是不是很描述性的,但我不能句话变得更好。

我试图编译有几个对象的静态链接库,所有的对象包含以下内容:

#include foo.h

foo.h中是沿着这些路线的东西:

#pragma once
template<class T>
class DataT{
    private:
        T m_v;
    public:
        DataT(T v) : m_v(v){}
};

typedef DataT<double> Data;

现在,一切工作正常,但如果我改变DataT是只是用双而非t的数据,我会在连接时间为每年得到LNK4006警告.OBJ,指出.ctor已经定义。

编辑1:

#pragma once

class Data{
    private:
        double m_v;
    public:
        Data(double v) : m_v(v){}
};

编辑2: 我使用MSVC7。 所述.ctor实际上是包含在这两种情况下,如

...
public:
   Data(double v);

#include foo.inl
...
//foo.inl
Data::Data(double v): m_v(v) {}

什么我想虽然完成,是不是有编制,但作为一个头中的用户可以使用。

有帮助吗?

解决方案

我不知道你想在编辑#2的例子做什么,但我的认为的可能有帮助,如果您在在foo.inl如下:

inline
Data::Data(double v): m_v(v) {}

如果也被包括在一些foo.inl的内容,其中inline关键字将无法正常工作或不应该,你也许可以通过使用扩展到什么或inline宏使用预处理程序来处理的区别适当。

其他提示

如果你把构造函数定义foo.cpp而不是foo.h的它不会被单独编译到每一个翻译单元。此刻的构造的一个副本被编译成每个对象的包含foo.h包括

在其它可能的解决方案是将得到的编译器内联的构造。有你的编译器设置禁用内联?构造函数看起来很容易就会自动内联。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top