分析: 代码之所以不能通过编译是因为A中的typedef晚于FinalMaker<A>中对A::RawType的引用, 所以我们要有方法更早的引用到A::RawType, 所以我让A又继承了Template<A>, 并把typedef写在Template<A>中, 这样A就会继承下这个typedef, 又考虑到构造函数的继承顺序, 所以Template<A>应被先继承, 且应该被virtual的方式继承:
template <class T>
class FinalMaker
{
private:
~FinalMaker() { }
friend class T::RawType;
};
template <class T>
struct Template
{
typedef T RawType;
};
class A : virtual public Template<A>, virtual public FinalMaker<A>
{
};
可惜, 还是报相同的错误, 这着实让我有些失落, 正当我打算放弃的时候, 我发现我做了一件舍近求远的事, Damn it!
很快我得到下面的代码:
template <class T>
struct Template
{
typedef T RawType;
};
template <class T>
class FinalMaker
{
private:
~FinalMaker() { }
friend class Template<T>::RawType;
};
class A : virtual public FinalMaker<A>
{
};
class B : public A
{
public:
static void static_func() { }
static int value;
};
int B::value = 0;
int main()
{
A a;
// B b; // error
B::static_func();
B::value = 1;
return 0;
}
编译, 通过!