在以下代码中,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;
}
类型的访问说明符似乎被忽略了,并且可以编译。
起初我怀疑这可能是gcc
中的错误,但是MSVC 2015表现出相同的行为。
这是出于某种原因,C ++标准要求吗?如果是这样,这里的理由是什么?
答案 0 :(得分:5)
起初我怀疑这可能是gcc中的错误,
您正确怀疑。 GCC在模板中有多个关于缺少可访问性检查的未解决错误,但是很明显,GCC的开发人员认为这些错误需要修复。即使使用依赖的typedef,您的示例也可能涵盖在template function specialization: does not respect access specifier中,而您的示例是非依赖的。
但是MSVC 2015表现出相同的行为。
如果您说MSVC有影响一致性的错误,没有人会怀疑您。 :)