类模板的成员函数返回值为嵌套类时,如何在外部定义?

lanniao10101 2017-09-19 08:40:03
#include<iostream>
template<typename T>
class One{
public:
class Two{
public:
Two(T tt):t(tt){}
private:
T t;
};
Two Assign(T);
};
template<typename T>
One<T>::Two One<T>::Assign(T tt)
{
return Two(tt);
}

1>e:\list\list\string.cpp(14): warning C4346: “One<T>::Two”: 依赖名称不是类型
1> 用“typename”为前缀来表示类型
1>e:\list\list\string.cpp(14): error C2143: 语法错误 : 缺少“;”(在“One<T>::Assign”的前面)
1>e:\list\list\string.cpp(14): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e\list\list\string.cpp(14): fatal error C1903: 无法从以前的错误中恢复;正在停止编译
1>
1>生成失败。

如果将Assign函数定义在One类里就能通过!
琢磨了好久不明白为什么,还请高人请教,不胜感激!
...全文
339 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2017-09-20
  • 打赏
  • 举报
回复
1>e:\list\list\string.cpp(14): warning C4346: “One<T>::Two”: 依赖名称不是类型 1> 用“typename”为前缀来表示类型 编译错误都不看的……
棉猴 2017-09-20
  • 打赏
  • 举报
回复
编译器把One<T>::Two看成是模板类One的成员变量Two,所以会报“依赖名称不是类型” 在One<T>::Two之前加入typename以提示C++编译器Twot是一个类型而不是变量。 请参见 C++中模板类 http://blog.csdn.net/hou09tian/article/details/77871174 希望对你有帮助
ForestDB 2017-09-19
  • 打赏
  • 举报
回复
嵌套类其outer类是它的名字空间,所以需要用::来修饰。
letitgowithwind 2017-09-19
  • 打赏
  • 举报
回复
这是C还是C++,看不懂,帮顶吧
paschen 版主 2017-09-19
  • 打赏
  • 举报
回复
使用typename关键字告诉编译器那个是一个类型名 http://en.cppreference.com/w/cpp/language/dependent_name
lanniao10101 2017-09-19
  • 打赏
  • 举报
回复
谢谢,这么可以解决!为什么是这样,能稍微解释一下吗?用这个关键字是说明返回值是个模板类型吗?
sdghchj 2017-09-19
  • 打赏
  • 举报
回复

template<typename T>
typename One<T>::Two One<T>::Assign(T tt)
{
    return Two(tt);
}
lanniao10101 2017-09-19
  • 打赏
  • 举报
回复

template<class T>
typename One<T>::Two One<T>::Assign(T tt)
{
    return Two(tt);
}
这里typename怎么解释
sdghchj 2017-09-19
  • 打赏
  • 举报
回复
引用 2 楼 lanniao10101 的回复:
谢谢,这么可以解决!为什么是这样,能稍微解释一下吗?用这个关键字是说明返回值是个模板类型吗?
对模板参数有依赖的符号,编译器在编译模板时不会自动去顺着依赖查找匹配的,所以在需要你显示指明它到底是不是一个类型,如果不加typename,它有可能是类型,也有可能是静态成员。

64,637

社区成员

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

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