我正在编写一个库来帮助简化我未来的开发过程,作为其中的一部分,我已经编写了一个char数组的包装器,它具有与std :: string'相同的功能。 s没有堆内存分配。该类使用定义:
template<size_t N>
class FString {
public:
/* String functionality */
private:
size_t mLength;
char mString[N + 1];
}
我在单独的解决方案中开发并测试了实现,并且所有内容(至少看起来都是)都可以工作,所以我将它包含在我的DLL项目中,并将它们添加到我使用标准declspec导入/导出定义的许多类定义中定义。我能够成功构建项目,但是我的输出充满了警告:
C4251 FString<260> needs to have dll-interface to be used by clients of class...
没有想到我包含了可以解决问题的导出/导入宏思想。虽然DLL项目本身能够构建,但我在解决方案中的测试项目无论在何处使用都会引发许多错误:
C2491 FString<N>::append definition of dllimport function not allowed...
对于我没有内联的每个函数,都会出现其中一个。查看错误导致我进入MSDN,在那里我发现错误的原因是因为整个类是模板化的并且是单个.hpp文件的一部分,即使它们是要导入的,函数的定义也存在。这是有道理的,我理解为什么这会是一个问题。
我设法解决警告和错误的唯一方法是包含导入/导出宏并内联每个函数。我不太确定如何内联&#39;使用模板化的类和函数,但有一些我通常不想内联的大函数。我意识到这更像是对编译器的一个提示,然后可能没有实际内联所有函数,但我希望有更多经验的人,然后我能够指出我正确的方向。
谢谢:)