C++ 一个TU中的模板专业化被另一个TU隐藏
我有一个类模板,它可以专门化,以便更改用户定义类型的实用函数的行为 我有一个翻译单元,它使用实用功能,并提供我的类型专业化功能。使用专业化 在一个单独的翻译单元中,如果我调用效用函数而不包括专门化,它会改变另一个TU的行为(两个TU中都不使用专门化)) 以下是描述我的问题的完整示例:C++ 一个TU中的模板专业化被另一个TU隐藏,c++,templates,template-specialization,C++,Templates,Template Specialization,我有一个类模板,它可以专门化,以便更改用户定义类型的实用函数的行为 我有一个翻译单元,它使用实用功能,并提供我的类型专业化功能。使用专业化 在一个单独的翻译单元中,如果我调用效用函数而不包括专门化,它会改变另一个TU的行为(两个TU中都不使用专门化)) 以下是描述我的问题的完整示例: check.h:定义可专门用于用户定义类型的类模板 type\u check.h:专门从事check的Foo lib.cpp:TU源文件-使用type\u check.h main.cpp: #include "c
check.h
:定义可专门用于用户定义类型的类模板
type\u check.h
:专门从事check
的Foo
lib.cpp
:TU源文件-使用type\u check.h
main.cpp
:
#include "check.h"
#include "type.h"
#include "lib.h"
#include "type_check.h" // uncomment this to make specialisation avail to all
int main()
{
check(5);
lib();
// check(FOO); // uncomment this to change behaviour of lib()`
return 0;
}
结果:
在main
中调用lib()
而不调用check(FOO)
check fall-back
check Foo
check fall-back
check fall-back <-- main changes behaviour of lib
check fall-back
check fall-back
check Foo
check Foo
在main
中调用lib()
和check(FOO)
,结果如下:
check fall-back
check Foo
check fall-back
check fall-back <-- main changes behaviour of lib
check fall-back
check fall-back
check Foo
check Foo
问题:
当检查
专业化不可用时,为什么在单独的TU中调用检查(FOO)
会将其从lib.cpp
中设置的重载中移除
笔记:
我不能将
检查
专业化与Foo
的定义放在同一个文件中,因为Foo
实际上是一个生成的文件(protobuf)这违反了一个定义规则。链接器看到同一函数的两个函数定义,并将选择一个。无需诊断
在这种情况下,void Check::type
由lib.cpp中使用的Check.h中的模板定义实例化定义一次,而另一个定义来自main.cpp中使用的type_Check.h。您应该提到哪个函数有两个定义
check fall-back
check fall-back <-- main changes behaviour of lib
check fall-back
check fall-back
check Foo
check Foo