结构继承:隐式公共还是私有?

时间:2014-04-11 16:27:14

标签: c++ inheritance struct public

我无法在一个小样本中隔离此错误以在此处进行演示,但即使是错误消息也是如此自相矛盾,以至于如果这是一个错误,可能会有一个想法,而不进行测试。

我有一个(可能是公开的)派生另一个结构的结构,但clang坚持认为这是隐式的私有继承:

error: 'next' is a private member of 'base'

note: constrained by implicitly private inheritance here
struct derived_temp <key> : base <derived>

虽然g ++编译得很好。我只更改了类的实际名称,以使消息更具可读性。代码如下所示:

template </*...*/>
struct base : //...
{
private:
    //...

public:
    template <typename I> I next(I i) const { return /*...*/; }
    //...
};

template <typename /*...*/>
struct derived_temp;

struct key { /*...*/ };

using derived = derived_temp <key>;

template <>
struct derived_temp <key> : base <derived>
{
   //...
};

我试图保持代码的形式与我的项目完全相同,只是更改名称并注释掉部分内容。

该错误是由于尝试在next()类型的临时对象上调用函数derived而引起的。

我唯一的解释是这可能是一个铿锵的错误(但是,我不能在一个小样本中重现它)迫使我改变

struct derived_temp <key> : base <derived>

更明确的

struct derived_temp <key> : public base <derived>

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

代码:

struct T1 {
  int x;
};

struct T2 : T1 {
  int y;
};

int main( int argc, char * argv[] ) {
  T2 t2;
  t2.x = 3;

  return t2.x;
}

建筑/运行:

~ clang blah.cc -o blah; ./blah; echo $?
3
~ clang blah.cc -std=c++11 -o blah; ./blah; echo $?
3

简而言之:默认为公共继承。


我花了一点时间来接近OPs代码;这是我放在一起的(请原谅错别字;我使用气垫机来测试它):

template <class T>
struct base {
  T x;
  template <typename I> I blah( I i ) const { return i + x.k.y; }
}

template <class T>
struct derived_temp;
struct key { int y; };
using derived = derived_temp<key>;
template <>
struct derived_temp<key> : base <derived> {
  int z;
  key k;
};

int main( int argc, char * argv[] ) {
  derived d;

  d.x   = 1;
  d.k.y = 2;
  d.z   = 3;

  return 0;
}

内置:

~ clang --version
clang version 3.4 (tags/RELEASE_34/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
~ clang++ test.cc -o test -std=c++11

我收到两个基本错误(我没有引用完整的内容,因为我必须手动输入所有内容):

test.cc:3:5: error: field has incomplete type 'derived_temp<key>'
test.cc:21:5: error: no member named 'x' in 'derived_temp<key>'

当我盯着这个时,试图理解你的动机/意图以及错误所说的内容,我发现你正在尝试做循环继承来定义事物。循环的方式,甚至可能是不可能的。

答案 1 :(得分:0)

那里有点东西。结构默认情况下应该使用公共继承。暂时忘记模板和using指令。

使用最简单的代码进行测试,设置您的疑似失败案例:

struct Base
{
int i;
};

struct Derived : Base
{
};

现在尝试从Derived实例访问i。如果这样做,它应该开始添加功能,直到它具有与原始代码相同的所有组件。

现在我没有自己动手测试它。所以我只是建议前进的方向。