如何在不使用模板时摆脱LNK4006的警告?

时间:2009-08-06 18:37:22

标签: c++ static-linking

我知道这个问题不是很具描述性,但我无法更好地说出来。

我正在尝试编译一个包含多个对象的静态链接库,所有对象都包含以下内容:

#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的数据,我将在每个.obj的链接时间收到LNK4006警告,说明.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 个答案:

答案 0 :(得分:2)

我不确定您在编辑#2的示例中尝试做什么,但是如果您在foo.inl中有以下内容,我认为它可能会有所帮助:

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

如果foo.inl的内容也包含在inline关键字不起作用或不应该起作用的内容中,您可以使用预处理器通过使用扩展的宏来处理差异

答案 1 :(得分:1)

如果将构造函数定义放在foo.cpp而不是foo.h中,则不会将其单独编译到每个翻译单元中。目前,构造函数的副本被编译到每个对象中,包含foo.h include。

另一种可能的解决方案是让编译器内联构造函数。您是否在编译器设置中禁用了内联?构造函数看起来很容易自动内联。