函数参数 为模板类中的模版类时,怎么调用此函数

GKatHere 2017-04-07 11:21:07
如题:函数参数 为模板类中的模版类时,怎么调用此函数
代码:

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());
}

...全文
473 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2017-04-09
  • 打赏
  • 举报
回复
Base<T>::Nested<T_> 的写法是 non-deduced context,编译器不会推导的,只能你显示指定。
GKatHere 2017-04-09
  • 打赏
  • 举报
回复
引用 5 楼 mitshan 的回复:
假设Nested是Base内的不含模板参数的类. 代码

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
引用 7 楼 ri_aje 的回复:
Base<T>::Nested<T_> 的写法是 non-deduced context,编译器不会推导的,只能你显示指定。
明白了, non-deduced context, 不可向上推断, 即参数为模板类中的嵌套类型时,不可由给定参数推断此模版类的模版类型

 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_”推导 模板 参数
mitshan 2017-04-08
  • 打赏
  • 举报
回复
上面的应该是

typedef int Nested;
写错了. // 也不知道怎么编辑,没权限,只有重新写一下.
mitshan 2017-04-08
  • 打赏
  • 举报
回复
假设Nested是Base内的不含模板参数的类. 代码

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
paschen 版主 2017-04-08
  • 打赏
  • 举报
回复
引用 3 楼 GKatHere 的回复:
[quote=引用 2 楼 paschen 的回复:] func<int, int>(c.getnst()); 这个也是可以的 但是: Nested<T>& getnst() {return nst}; 改成: Nested<T>& getnst() {return nst;} 其他的不行,需要显示推导模板参数
奇怪, VS2010 不行 template<typename T1_> struct A { template<typename T2_> struct B{}; B<T1_> getb(){return B<T1_>();}; }; template<typename T1_, typename T2_> void foo(typename A<T1_>::B<T2_>){}; int _tmain(int argc, _TCHAR* argv[]) { A<int> a; A<int>::B<int> b; foo<int, int>(a.getb()); // error C2770: “void foo(A<T1_>::?$B@$RT2_@BAAC@)”的显式 模板 参数无效 foo<int, int>(b); //error C2770: “void foo(A<T1_>::?$B@$RT2_@BAAC@)”的显式 模板 参数无效 }[/quote] 可能VS2010对模板的支持不算太好吧,但在VS2015上这段代码是可以成功编译的
GKatHere 2017-04-08
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
func<int, int>(c.getnst()); 这个也是可以的 但是: Nested<T>& getnst() {return nst}; 改成: Nested<T>& getnst() {return nst;} 其他的不行,需要显示推导模板参数
奇怪, VS2010 不行 template<typename T1_> struct A { template<typename T2_> struct B{}; B<T1_> getb(){return B<T1_>();}; }; template<typename T1_, typename T2_> void foo(typename A<T1_>::B<T2_>){}; int _tmain(int argc, _TCHAR* argv[]) { A<int> a; A<int>::B<int> b; foo<int, int>(a.getb()); // error C2770: “void foo(A<T1_>::?$B@$RT2_@BAAC@)”的显式 模板 参数无效 foo<int, int>(b); //error C2770: “void foo(A<T1_>::?$B@$RT2_@BAAC@)”的显式 模板 参数无效 }
paschen 版主 2017-04-07
  • 打赏
  • 举报
回复
func<int, int>(c.getnst()); 这个也是可以的 但是: Nested<T>& getnst() {return nst}; 改成: Nested<T>& getnst() {return nst;} 其他的不行,需要显示推导模板参数
paschen 版主 2017-04-07
  • 打赏
  • 举报
回复
前两种是可以的: func<int, int>(a); func<int, int>(b);

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧