gpt4 book ai didi

c++ - 一个 TU 中的模板特化被另一个 TU 隐藏

转载 作者:太空狗 更新时间:2023-10-29 21:39:30 26 4
gpt4 key购买 nike

我有一个类模板,它可以被专门化以改变用户定义类型的效用函数的行为。

我有一个使用效用函数的翻译单元我的类型的专业可用。使用特化。

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

这是描述我的问题的完整示例:

check.h : 定义可以专门用于用户定义类型的类模板

#pragma once
#include <iostream>

template<typename T>
struct Check
{
static void type();
};

template<typename T>
void Check<T>::type()
{
std::cout << "check fall-back\n";
}

template<typename T>
void check(T&&)
{
Check<T>::type();
}

type.h : 我的用户定义类型的定义

#pragma once

enum Foo
{
FOO,
BAR
};

type_check.h : 专业Check对于 Foo

#pragma once
#include "type.h"
#include "check.h"

template<>
struct Check<Foo>
{
static void type()
{
std::cout << "check Foo\n";
}
};

lib.h : TU 头文件

#pragma once

void lib();

lib.cpp : TU 源文件 - 使用来自 type_check.h 的特化

#include "lib.h"
#include "type_check.h"

void lib()
{
check(FOO);
}

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;
}

结果:

调用 lib()不打电话check(FOO)main结果如下:

check fall-back
check Foo

调用 lib()check(FOO)main结果如下:

check fall-back
check fall-back <-- main changes behaviour of lib
check fall-back

包括type_check.hmain.cpp , 然后调用 lib()check(FOO)main结果如下:

check fall-back
check Foo
check Foo

问题:

为什么调用 check(FOO)在一个单独的 TU 中时 Check<Foo>特化不可用,将其从 lib.cpp 中的重载集中删除?

注意事项:

我不能只把 Check<Foo>在与 Foo 的定义相同的文件中专门化, 作为 Foo实际上是一个生成文件(protobuf)

最佳答案

这违反了单一定义规则。链接器看到同一个函数的两个函数定义,并会选择一个。无需诊断。

在这种情况下,void Check<Foo>::type一次由 lib.cpp 中使用的 check.h 中模板定义的实例化定义,而另一个定义来自 main.cpp 中使用的 type_check.h。

关于c++ - 一个 TU 中的模板特化被另一个 TU 隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32833906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com