2013-04-05 57 views
2

在这种情况下,为什么我无法访问B1案例中不合格的基类成员x?不loook暧昧我...从模板继承时需要合格的访问权限

template<class T> 
struct A { T x; }; 

template<class T> 
struct B1 : A<T> { T f() { return A<T>::x; } }; 

struct B2 : A<int> { int f() { return x; } }; 
+0

不知道在使用 – pascal 2013-04-05 11:57:12

回答

3

因为x不依赖,它会在模板中定义的 上下文中抬起头来。在这种情况下, 编译器不知道T,并且无法查看依赖的基类 类。例如,它如何知道A<T>的任何内容,而不知道T是什么。 (可能有A的专门化,例如完全不同的成员。)

+0

之前使用A :: x'这不能解释*为什么编译器无法看到x '。基类不是'T',它是'A ',当'B1'被定义时'A '的定义已经可用。我知道这种语言并不是那种方式,但是我所读到的这个问题是“为什么不呢?” – hvd 2013-04-05 11:57:35

+0

实际上,我认为这里的问题更多的是为什么它不能看到'x',因为我们知道*基类型是'A '。根本没有模板参数。 – 2013-04-05 11:58:40

+0

基类依赖于'T'。编译器在知道“T”是什么之前不能看到它。 (如果'A '明确专用于某些类型,例如? – 2013-04-05 12:04:33