我有一个问题。我有一个看起来像这样的类结构:
// Common.hpp
template <typename Type>
class CommonInternalRegistrar
{
CommonInternalRegistrar ( Type* pointerToRegister ) ;
} ;
template <typename Type>
class DerivesFrom
: public virtual Type
, public CommonInternalRegistrar<Type>
{
DerivesFrom ()
: CommonInternalRegistrar<Type> ( this )
{ }
} ;
class MyInterface
{
virtual void doSomething () =0 ;
} ;
// CommonClass1.hpp
class DLL_FLAG MyCommonClass
: public DerivesFrom<MyInterface>
{ } ;
// Class1.cpp in LibraryA.dll
namespace some_namespace {
class DLL_FLAG_A MyClass
: public MyCommonClass
{ } ;
}
// Class2.cpp in LibraryB.dll
namespace some_namespace {
class DLL_FLAG_B MyClass
: public DerivesFrom<MyInterface>
{ }
}
那些迂腐的人的一些笔记:
我在公开场合松懈:在本例中可读性的课程
在这个例子中,DerivesFrom做了一些有用的事情并不是很明显。但是,在我们的架构中,确实如此,您必须相信它是必要的。
DLL_FLAG是一个宏,在编译代码时
现在,问题是:
在LibraryA中,导出MyClass和MyCommonClass。由于导出了MyCommonClass,因此也会导出DerivesFrom(至少在VS2012中会出现这种情况)。
然后,当LibraryB导出MyClass时,它还会导出DerivesFrom(wtf?)。
然后,当我们将MyExecutable.exe(作为cmake定义的构建过程的一部分)与LibraryA.dll和LibraryB.dll链接时,它会失败,因为有一个重复的DerivesFrom - 来自每个库的一个。
我们之前见过并且无法使用的解决方案:
__ declspec(dllexport)DerivesFrom在一个库中导入并在另一个库中导入。但是,这需要代码中太多的废话,而这些代码实际上不应该存在。然后它强迫一个图书馆到主持人#34;这个概念在我们的系统中没有意义。
&#34;不要这样做。&#34;好吧,我说Visual Studio不应该这样做。或者我们应该能够指定DerivesFrom(以及DerivesFrom的所有实例化)只有内部链接,因此它的符号永远不会被导出。
我感到茫然:
为什么VS2012会自动导出模板并拒绝让每个库使用自己的模板。
为什么我不能告诉它永远不要导出这些模板(这可能不可行,因为有时候,两个库可能来自一个其中包含DerivesFrom&lt;&gt;的类。)
如何解决此问题。
任何想法都将不胜感激!