我知道这个问题不是很具描述性,但我无法更好地说出来。
我正在尝试编译一个包含多个对象的静态链接库,所有对象都包含以下内容:
#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) {}
我想要完成的是,不是要编译,而是作为用户可以使用的标题。
答案 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。
另一种可能的解决方案是让编译器内联构造函数。您是否在编译器设置中禁用了内联?构造函数看起来很容易自动内联。