C++ 一个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

我有一个类模板,它可以专门化,以便更改用户定义类型的实用函数的行为

我有一个翻译单元,它使用实用功能,并提供我的类型专业化功能。使用专业化

在一个单独的翻译单元中,如果我调用效用函数而不包括专门化,它会改变另一个TU的行为(两个TU中都不使用专门化)

以下是描述我的问题的完整示例:
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