Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不明确类型引用_C++_Templates_Typedef_Multiple Inheritance - Fatal编程技术网

C++ 不明确类型引用

C++ 不明确类型引用,c++,templates,typedef,multiple-inheritance,C++,Templates,Typedef,Multiple Inheritance,为什么这样做有效: template <typename T> struct foo { }; struct A { typedef foo<A> type; }; struct B : public A { typedef foo<B> type; }; int main() { B::type john; return 0; } 模板 结构foo { }; 结构A { typedef-foo型; }; 结构B:公共

为什么这样做有效:

template <typename T> 
struct foo
{
};

struct A
{
    typedef foo<A> type;
};

struct B : public A
{
    typedef foo<B> type;
};

int main()
{
    B::type john;
    return 0;
}
模板
结构foo
{
};
结构A
{
typedef-foo型;
};
结构B:公共A
{
typedef-foo型;
};
int main()
{
B::约翰型;
返回0;
}
但不是这个:

template <typename T> 
struct foo
{
};

template <typename T>
struct Shared
{
    typedef foo<T> type;
};

struct A : public Shared<A>
{
};

struct B : public A, public Shared<B>
{
};

int main()
{
    // g++ 4.5 says :
    // error: reference to 'type' is ambiguous
    B::type john;
    return 0;
}
模板
结构foo
{
};
样板
结构共享
{
typedef-foo型;
};
结构A:公共共享
{
};
结构B:公共A,公共共享
{
};
int main()
{
//g++4.5说:
//错误:对“类型”的引用不明确
B::约翰型;
返回0;
}

在我的代码中,
foo
实际上是
boost::shared_ptr
,正如您所看到的,我正在尝试使用
shared
类来计算一些
typedef

因为您实际上有两个
type
typedef。一个来自
A
,从
shared
获取他的信息,另一个来自
shared
。在第一种情况下,使用
B

中的typedef隐藏
A
基类的
type
typedef,因为实际上有2个
type
typedef。一个来自
A
,从
shared
获取他的信息,另一个来自
shared
。在第一种情况下,使用
B
中的typedef隐藏
A
基类的
type
typedef,因为
B
继承
foo
,并间接继承
foo
,两者都包含成员
type
。你是什么意思


简单的第一段代码有
B
类型
隐藏
A
类型
但在更复杂的第二段代码中没有这种情况,这涉及到一个更深的继承树。

因为
B
继承
foo
,并且间接地继承
foo
,并且都包含一个成员
类型
。你是什么意思


简单的第一段代码有
B
类型
隐藏
A
类型
但在更复杂的第二段代码中不会发生这种情况,这涉及到更深层的继承树。

因为,您指的是哪种B::类型,B::A::Shared::type还是B::Shared::type,它们不一样。。。在第一个示例中,您指定的是您正在谈论的类型,因为它实际上是在B类中定义的,因为,您引用的是哪种B::类型,B::A::Shared::type或B::Shared::type,它们不相同。。。在第一个示例中,您指定了您所谈论的类型,因为它实际上是在B类中定义的