我在: 试题:实现一个不能被继承的类(上)中有如下代码:
template <class T>
class FinalMaker
{
private:
~FinalMaker() { }
friend class T;
};
class A : virtual public FinalMaker<A>
{
};
...
其中不能通过编译的是这句:friend class T;
今天翻开大学时候的笔记本, 看到了这个模板技术:型别映射型别
#include <iostream>
using namespace std;
template <typename T>
struct Template
{
typedef T RawType;
};
int main()
{
cout << Template<int>::RawType() << endl;
cout << Template<double>::RawType() << endl;
return 0;
}
于是我想到在A中也加个typedef试试
经过整理代码如下:
template <class T>
class FinalMaker
{
private:
~FinalMaker() { }
friend class T::RawType;
};
class A : virtual public FinalMaker<A>
{
public:
typedef A RawType;
};
...
编译报错在这一句:class A : virtual public FinalMaker<A>, 原因:error: invalid use of incomplete type 'class A' (FinalMaker<A>需要完整的A的定义)
做修改如下:
template <class T>
class FinalMaker;
class A : virtual public FinalMaker<A>
{
public:
typedef A RawType;
};
template <class T>
class FinalMaker
{
private:
~FinalMaker() { }
friend class T::RawType;
};
...
编译报错还是在这一句:class A : virtual public FinalMaker<A>, 原因:error: invalid use of incomplete type 'struct FinalMaker<A>' (A需要完整的FinalMaker<A>的定义)
从上面两段代码知道A与FinalMaker<A>相互需要对方的完整定义, 所以用这种方法尝试不能成功!