- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类模板,它可以被专门化以改变用户定义类型的效用函数的行为。
我有一个使用效用函数的翻译单元我的类型的专业可用。使用特化。
在一个单独的翻译单元中,如果我在不包括特化的情况下调用效用函数,它会改变另一个 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.h
在 main.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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!