c++20 msvc错误c3861找不到基本成员
c++20 msvc error c3861 base member not found
我有一个奇怪的问题,因为我将我的 C++ 项目的 VS2022 中的 C++ 语言标准从 17 切换到 20。
我收到编译器错误 C3861 未找到标识符。本例中的标识符是基 class.
的成员
基础class:
template <class C> class base_vector
{
public:
base_vector()
{
}
virtual ~base_vector()
{
}
protected:
std::vector<C> m_vec;
};
派生class:
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
是基础 class 的成员,具体取决于模板参数。
在模板实例化之前,编译器无法知道 m_vec
确实是基 class 的成员,但它必须在解析模板时对 m_vec
进行名称查找定义,因为 m_vec
不是从属名称。
您需要明确使用 this->m_vec
。 this
是相关的,这种形式将延迟名称查找,直到知道模板参数和基础 class。
在C++20之前也是如此。默认情况下,MSVC 确实以一种不符合标准的方式进行名称查找,这就是它默认工作的原因。要获得符合标准的行为,您需要为 MSVC 提供 /permissive-
标志。使用 /std:c++20
标志或更高版本时,该标志是隐含的。 (https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-170)
我有一个奇怪的问题,因为我将我的 C++ 项目的 VS2022 中的 C++ 语言标准从 17 切换到 20。
我收到编译器错误 C3861 未找到标识符。本例中的标识符是基 class.
的成员基础class:
template <class C> class base_vector
{
public:
base_vector()
{
}
virtual ~base_vector()
{
}
protected:
std::vector<C> m_vec;
};
派生class:
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
是基础 class 的成员,具体取决于模板参数。
在模板实例化之前,编译器无法知道 m_vec
确实是基 class 的成员,但它必须在解析模板时对 m_vec
进行名称查找定义,因为 m_vec
不是从属名称。
您需要明确使用 this->m_vec
。 this
是相关的,这种形式将延迟名称查找,直到知道模板参数和基础 class。
在C++20之前也是如此。默认情况下,MSVC 确实以一种不符合标准的方式进行名称查找,这就是它默认工作的原因。要获得符合标准的行为,您需要为 MSVC 提供 /permissive-
标志。使用 /std:c++20
标志或更高版本时,该标志是隐含的。 (https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-170)