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_vecthis 是相关的,这种形式将延迟名称查找,直到知道模板参数和基础 class。

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