在函数模板签名中忽略了成员typedef的访问说明符

时间:2018-09-06 10:10:04

标签: c++

在以下代码中,A::Typeprivate中是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 ++标准要求吗?如果是这样,这里的理由是什么?

1 个答案:

答案 0 :(得分:5)

  

起初我怀疑这可能是gcc中的错误,

您正确怀疑。 GCC在模板中有多个关于缺少可访问性检查的未解决错误,但是很明显,GCC的开发人员认为这些错误需要修复。即使使用依赖的typedef,您的示例也可能涵盖在template function specialization: does not respect access specifier中,而您的示例是非依赖的。

  

但是MSVC 2015表现出相同的行为。

如果您说MSVC有影响一致性的错误,没有人会怀疑您。 :)