首页 > 解决方案 > 函数模板签名中忽略成员 typedef 的访问说明符

问题描述

下面的代码A::Type在.privateA

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++ 标准是否要求这种行为?如果是这样,这里的理由是什么?

标签: c++

解决方案


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

你猜对了。GCC 有多个关于模板中缺少可访问性检查的开放错误,但很明显,它的开发人员认为这些错误需要修复。您的示例可能已被模板函数专业化覆盖:不尊重访问说明符,即使它使用依赖的 typedef,而您的示例是非依赖的。

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

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


推荐阅读