我有以下代码,它们没有编译:
class A {
public:
typedef int A_t;
};
template<class T>
class IB {
public:
typedef typename T::A_t B_t;
virtual B_t get() = 0;
protected:
B_t v;
IB(B_t in) : v(in) { }
};
template<class T>
class B : public IB<T> {
public:
B(B_t in) : IB<T>(in) { } // error: expected ')' before 'in'
B_t get() { return B_t(); } // error: B_t does not name a type
};
int main() {
B<A> a(3); // Errors here since int can't be converted to const B& or const B&&
// Also because A is virtual, since A::get() doesn't compile
return 0;
}
据我所知,错误消息的主要问题是typedef
IB
B
由于某种原因而无法在typedef IB<T>::B_t B_t;
中使用。
如果我在B
构造函数上方添加一行B_t
,则代码编译正常,但我不明白为什么我需要这个。不应该通过继承获得B(IB<T>::B_t in) : IB<T>(in) { }
// etc, with qualified references to B_t
吗?
此外,以下内容也不起作用:
B_t
产生相同的错误消息。
此处的机制是什么阻止我在B
typedef
使用{{1}}而没有额外的{{1}}?