为什么Visual Studio允许我在模板函数(C ++)中使用私有成员?

格列布·斯克里普尼科夫(Gleb Skripnikov)

我对Visual Studio的异常行为感到困惑。

class Test
{
private:
    int x;
};

void func()
{
    Test t;
    t.x; // VS shows error here
}

语法错误

该代码无法编译,因为我正在尝试访问私有成员 x

但是在使用模板功能的情况下,VS表示一切正常,让我可以访问 x

class Test
{
private:
    int x;
};

template <class T>
void func()
{
    Test t;
    t.x; // No error
}

模板功能没有错误

VS给我看了私人领域

如果我调用此模板函数,则结果将是编译时错误,并且我理解原因。但是我不明白为什么VS在编辑器窗口中不显示错误。在某些情况下此功能可以使用?还是仅仅是VS编辑器中的错误?

达鲁尼

在实例化模板之前,模板函数才是函数(这是生成函数的蓝图)。

为了产生错误,VS总是告诉您实际的模板参数是什么。由于您尚未使用任何实例化它,因此无法创建该错误消息(尽管技术原因可能是另一回事)。

一旦开始将模板用于某些用途,您应该会遇到编译错误。

但是,这是特定于Visual Studio的。其他编译器会在此处给出正确的错误,因为Test::x它不是从属名称。这是Visual Studio正在改进的已知薄弱环节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C ++允许返回对私有成员的引用

为什么我不能访问TypeScript私有成员?

为什么甚至可以更改私有成员或使用反射在C#中运行私有方法?

为什么 C++ 模板类可以访问其基类的私有成员?

成为私有成员(c ++类)意味着什么?

Java为什么不允许接口中的私有成员?

为什么 Friend 函数不能访问类的私有成员

在get中使用私有成员而不是让类自动设置属性本身有什么好处?

为什么在重载C ++时无法访问私有成员

为什么我不能在类定义中直接初始化私有成员变量

什么时候可以针对私有成员类型专门化模板?

带有公共 getter 和 setter 的私有成员的目的是什么?C#

私有静态成员函数与私有成员函数

正则表达式可捕获在python中使用私有成员的代码,除非其为函数def

什么时候应该使私有成员成为静态成员,以及在我的情况下该如何覆盖

C ++:访问该类的私有成员

私有成员c++问题

c ++模板模板:无法访问私有成员

在C ++中,类仅包含(默认情况下)私有成员有什么用?

为什么函数模板不允许使用私有类型的显式特化?

使用friend函数,我们可以覆盖该类的私有成员吗?

为什么我收到错误“无法访问类中声明的私有成员”,即使我已经声明了朋友类

在公共成员函数内部访问私有成员变量

私有成员和受保护成员:C ++

为什么我可以在decltype()中使用私有默认构造函数?

为什么在C ++中使用私有副本构造函数与已删除副本构造函数

在类定义和静态数据的使用之外定义私有成员函数

为什么在 C++ 中允许重新声明模板成员函数?

使用C#或Java进行子类化时是否可以覆盖私有成员?