c++ - 函数模板签名中忽略成员 typedef 的访问说明符
问题描述
下面的代码A::Type
在.private
A
class A {
typedef int Type;
};
void func(int t, A::Type var)
{
return;
}
尝试编译gcc
会出现以下错误。
test.cpp: In function 'void func(int, A::Type)':
test.cpp:12:21: error: 'typedef int A::Type' is private within this context
void func(int t, A::Type var)
^~~~
test.cpp:2:17: note: declared private here
typedef int Type;
^~~~
但是如果我将第一个参数更改为模板参数,就像这样
template<typename T>
void func(T t, A::Type var)
{
return;
}
Type 的访问说明符似乎被忽略了,并且可以编译。
起初我怀疑这可能是一个错误gcc
,但 MSVC 2015 表现出相同的行为。
出于某种原因,C++ 标准是否要求这种行为?如果是这样,这里的理由是什么?
解决方案
起初我怀疑这可能是 gcc 中的一个错误,
你猜对了。GCC 有多个关于模板中缺少可访问性检查的开放错误,但很明显,它的开发人员认为这些错误需要修复。您的示例可能已被模板函数专业化覆盖:不尊重访问说明符,即使它使用依赖的 typedef,而您的示例是非依赖的。
但 MSVC 2015 表现出相同的行为。
如果您说 MSVC 存在影响一致性的错误,没有人会怀疑您。:)
推荐阅读
- html - 在移动设备上的电子邮件预览中隐藏 HTML 横幅
- c# - c# 中是否有 f'{}' 的等价物
- ios - iOS 应用可以直接接收 Google Drive 推送通知吗?
- winapi - 当窗口最小化时更改系统颜色时菜单栏消失
- powerpc - Powerpc systemsim-p8 无法在 ubuntu 64 16.04 LTS 中启动 debian 64
- asp.net-mvc - 如何在asp.net mvc中制作短网址以显示帖子内容
- powershell - REST API:使 cURL POST 适应 Powershell 5(上传文件)
- angular - Angular6 - ngIf 不会破坏对象
- android - 如何在 Google Play Console 中发布 Android App Bundle?
- arrays - 将分隔的多行字符串文件读入 Bash 中的多个数组