65,186
社区成员




template <class T>
class Base
{
public:
template <class T_>
class Nested
{
public:
Nested(int a=0) : x(a) {}
private:
int x;
};
Nested<T> nst;
Nested<T>& getnst() {return nst};
};
template<class T, class T_>
void func(const typename Base<T>::Nested<T_>& test) //使用typename,很好的
{
cout << "Very Good" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a=5;
Base<int>::Nested<int> b;
Base<int> c;
// 下面所有方法 ERR
func<int, int> (a);
func<int, int> (b);
func<int, int> (c);
func<int, int> (c.getnst());
func(a);
func(b);
func(c);
func(d);
func (c.getnst());
}
template<class T_>
struct A
{
struct B{};
};
template<class T_>
void FTV(typename A<T_>::B) { }
A<int>::B aa;
FTV<int>(aa); // OK
FTV(aa); // error C2783: “void FTV(A<T_>::B)”: 未能为“T_”推导 模板 参数
typedef int Nested;
写错了. // 也不知道怎么编辑,没权限,只有重新写一下.
Base<int>::Nested b;
func(b);
用不了,是因为无法从对象b推断出Base部分的模板类型.
比如Nested在Base内是这么定义的:
typedef int Base;
这样你声明出来的b就是一个int,并不包含任何Base是哪个类型实例化的信息,所以无法推断出来.
Reference: http://stackoverflow.com/questions/4092237/c-nested-class-of-a-template-class