1

我知道这个问题不是很具有描述性,但我无法更好地表达它。

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

#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 的 Data,我将在每个 .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) {}

不过,我想要完成的不是编译它,而是作为用户可以使用的标题。

4

2 回答 2

2

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

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

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

于 2009-08-06T20:42:18.047 回答
1

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

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

于 2009-08-06T18:45:52.000 回答