gpt4 book ai didi

c++ - 基类复制构造函数的可见性问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:22 25 4
gpt4 key购买 nike

我有一个类(暂时称它为base),它有一个 protected 接口(interface),包括 protected 构造函数等。base 的一些功能|返回 base 的一个实例按值(value):

class base {
protected:
base() {}
base (base const &other) {} // line 6
base foo () {
base ret;
return ret;
}
};

这些函数被包装在派生类中以返回派生类型,如下所示:

class derived : public base {
private:
derived(base const &b) : base(b) {}
public:
derived() : base() {}
derived foo() {
derived d(base::foo()); // line 21
return d;
}
};

方便从base的转换返回类型为 derived返回类型,我在 derived 中提供了一个私有(private)构造函数处理这个。

在 Centos 5.8 上使用 gcc 4.1.2 编译会产生以下错误:

test.cpp: In member function ‘derived derived::foo()’:
test.cpp:6: error: ‘base::base(const base&)’ is protected
test.cpp:21: error: within this context

在 Linux Mint 12 上使用 gcc 4.6.1 和 clang 2.9,代码编译文件,即使使用 -Wall -Wextra , 除了 unused parameter base 警告的复制构造函数。

我认为这可能是 gcc 4.1.2 中的一个编译器错误,但我无法在网上找到任何东西。有人以前见过这个吗?

我无法在没有巨大痛苦的情况下更新编译器。除了公开基类的复制构造函数之外,是否有简单的解决方法?


编辑 我添加了 base b;derived::foo() 的第 21 行之前.在那种情况下,gcc 4.6.1 和 gcc 4.1.2 提示 base 的默认构造器。 protected ,clang 2.9 会在没有警告的情况下进行编译。这就是 David Rodríguez - dribeas 在他的评论中所说的 - 不能在 base 的不同实例上调用默认 ctor。 .


EDIT 2 似乎适用于此的标准段落是 11.5 [class.protected]。 gcc 4.1.2 拒绝我的代码似乎是正确的,我想知道为什么 gcc 4.6.1 和 clang 允许它。请参阅我自己的答案以获得初步解决方案。

最佳答案

您可以尝试的解决方法是为 derived 创建一个私有(private)构造函数,该构造函数通过调用基函数构造它的基:

class derived : base {
struct from_base_foo {};
derived( from_base_foo ) : base( base::foo() ) {}
public;
derived foo() {
return derived( from_base_foo() );
}
};

关于c++ - 基类复制构造函数的可见性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473011/

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