题
我知道这个问题是不是很描述性的,但我不能句话变得更好。
我试图编译有几个对象的静态链接库,所有的对象包含以下内容:
#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
包括
在其它可能的解决方案是将得到的编译器内联的构造。有你的编译器设置禁用内联?构造函数看起来很容易就会自动内联。
不隶属于 StackOverflow