我无法在一个小样本中隔离此错误以在此处进行演示,但即使是错误消息也是如此自相矛盾,以至于如果这是一个错误,可能会有一个想法,而不进行测试。
我有一个(可能是公开的)派生另一个结构的结构,但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>
有什么想法吗?
答案 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。如果这样做,它应该开始添加功能,直到它具有与原始代码相同的所有组件。
现在我没有自己动手测试它。所以我只是建议前进的方向。