gpt4 book ai didi

c++ - 初始值设定项是基类名称时出现错误 'initializer does not name a non-static data member or base class'

转载 作者:行者123 更新时间:2023-12-04 17:01:27 29 4
gpt4 key购买 nike

我面临以下问题。在文件 my_exception.h 中,我定义了我自己的异常类继承自 std::exception :

// File "my_exception.h"
#include <exception>
#include <string>

namespace proj { namespace exception {

struct Exception : public std::exception {
explicit Exception(const std::string& msg) noexcept : msg_(msg) { }

inline const char* what() const noexcept override { return msg_.c_str(); }

private:
std::string msg_;
};

} }

然后我定义了一个名为 BadParameterAccess 的派生异常类在另一个命名空间中,分别在 .h 和 .cpp 文件中拆分声明和实现:
// File parameter_exception.h
#include "exception.h"

namespace proj { namespace parameter {

struct BadParameterAccess final : public exception::Exception
{
BadParameterAccess() noexcept;
};

} }

// File parameter_exception.cpp
#include "parameter_exception.h"

namespace proj { namespace parameter {

BadParameterAccess::BadParameterAccess() noexcept
: exception::Exception("[BadParameterAccess] parameter not set yet."){ }

} }

我尝试使用多个编译器编译此代码。
使用 clang 6.0 我收到以下错误:
parameter_exception.cpp:7:18: error: initializer 'Exception' does not name a non-static data member or base class; did you mean the base class 'Exception'?
: exception::Exception("[BadParameterAccess] parameter not set yet."){ }
^~~~~~~~~
Exception
./parameter_exception.h:11:35: note: base class 'exception::Exception' specified here
struct BadParameterAccess final : public exception::Exception
^~~~~~~~~~~~~~~~~~~~~~~~~~~

g++ 7 给出了一个等效的错误,Visual Studio 2017 给出了以下错误:
parameter_exception.cpp(8): error C2039: 'Exception': is not a member of 'std::exception'

代码在以下任一情况下都能完美编译:
  • 在文件 parameter_exception.cpp 中,我指定了基类初始值设定项的完整路径( proj::exception::Exception ),或
  • 在文件 parameter_exception.cpp 中,我从基类初始值设定项( Exception )或
  • 中删除了命名空间
  • 在文件 my_exception.h 中,我从 std::exception 中删除了继承, 或
  • 我重命名我的命名空间 exception以其他方式。

  • 据我从我得到的不同错误中了解到,编译器希望找到一个名为 Exception 的成员。类内 std::exception而不是在命名空间内 exception ,但我不明白为什么会发生这种情况。
    此外,当我从 exception::Exception 继承时,我预计编译器会给我一个错误。首先在头文件 parameter_exception.h 中,但它没有。

    有人可以向我解释原因吗?

    先感谢您。

    最佳答案

    正如@molbdnilo 所暗示的那样,名称查找存在问题。问题在于名称“异常”被用于命名空间异常和标准::异常结构。我从您发布的代码中删除了代码和注释。

    namespace standard {
    struct exception{
    explicit exception() noexcept { }
    };
    }
    namespace exception {
    struct A: public standard::exception {
    explicit A() noexcept { }
    };
    }
    namespace parameter {
    struct BadParameterAccess final : public exception::A
    {
    //BadParameterAccess() noexcept : exception::A() { }; // KO
    BadParameterAccess() noexcept : ::exception::A() { }; // OK
    };
    }

    namespace standard1 {
    struct exception1{
    explicit exception1() noexcept { }
    };
    }
    namespace exception2 {
    struct A: public standard1::exception1 {
    explicit A() noexcept { }
    };
    }
    namespace parameter1 {
    struct BadParameterAccess1 final : public exception2::A
    {
    BadParameterAccess1() noexcept : exception2::A() { }; // OK
    //BadParameterAccess1() noexcept : ::exception2::A() { }; // OK
    };
    }

    关于c++ - 初始值设定项是基类名称时出现错误 'initializer does not name a non-static data member or base class',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750975/

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