首页 > 解决方案 > 为什么 Visual Studio 允许我在模板函数 (C++) 中使用私有成员?

问题描述

我对 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 编辑器中的一个错误?

标签: c++visual-studioooptemplates

解决方案


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

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

一旦你开始使用你的模板做某事,你应该得到编译错误。

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


推荐阅读