gpt4 book ai didi

c++20 msvc错误c3861找不到基本成员

转载 作者:行者123 更新时间:2023-12-05 02:34:49 26 4
gpt4 key购买 nike

我有一个奇怪的问题,因为我将我的 C++ 项目的 VS2022 中的 C++ 语言标准从 17 切换到 20。

我收到编译器错误 C3861 未找到标识符。本例中的标识符是基类的成员。

基类:

template <class C> class base_vector
{
public:
base_vector()
{
}
virtual ~base_vector()
{
}
protected:
std::vector<C> m_vec;
};

派生类:

template <class C> class child_vector : public base_vector<C>
{
public:
child_vector()
{
}
virtual ~child_vector()
{
m_vec.clear(); // c3861
}
};

当我将标准切换到 c++17 时,没有编译器错误。

m_vec 应该在 child_vector 中已知,但事实并非如此。任何人都可以看到问题吗?非常感谢

最佳答案

m_vec 是依赖于模板参数的基类的成员。

在模板实例化之前,编译器无法知道m_vec确实是基类的成员,但在解析模板时必须对m_vec进行名称查找定义,因为 m_vec 不是从属名称。

您需要明确地使用this->m_vecthis 是依赖的,这种形式将延迟名称查找,直到知道模板参数和基类。

在 C++20 之前也是如此。默认情况下,MSVC 确实以一种不符合标准的方式进行名称查找,这就是它默认工作的原因。要获得符合标准的行为,您需要为 MSVC 提供 /permissive- 标志。使用 /std:c++20 标志或更高版本时,该标志是隐含的。 ( https://learn.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-170 )

关于c++20 msvc错误c3861找不到基本成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70705886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com