C++ 使用typedef–;基于类的模板参数–;类外范围
如何在类函数的声明和定义中使用基于类的模板参数的C++ 使用typedef–;基于类的模板参数–;类外范围,c++,templates,parameters,typedef,C++,Templates,Parameters,Typedef,如何在类函数的声明和定义中使用基于类的模板参数的typedef 假设我的班级是: template<class T> class A { typedef T::T1 X; typedef T::T2 Y; X& f1(Y& y); Y& f2(Y& y); // More declarations }; 模板 甲级 { 类型定义T::T1 X; 类型定义T::t2y; X&f1(Y&Y); Y&f2(Y&Y
typedef
假设我的班级是:
template<class T>
class A
{
typedef T::T1 X;
typedef T::T2 Y;
X& f1(Y& y);
Y& f2(Y& y);
// More declarations
};
模板
甲级
{
类型定义T::T1 X;
类型定义T::t2y;
X&f1(Y&Y);
Y&f2(Y&Y);
//更多声明
};
所以在定义中,我不能只写:
typedef typename T::T1 X;
typedef typename T::T2 Y;
template<class T>
X& A<T>::f1(Y& y) {...}
template<class T>
Y& A<T>::f2(Y& y) {...}
typedef类型名T::T1 X;
typedef typename T::t2y;
模板
X&A::f1(Y&Y){…}
模板
Y&A::f2(Y&Y){…}
(在我的例子中,T
是MaxSimplePathVertex
,我还有3个typedef,所以它非常麻烦)
我想我可以将所有的typedef复制到每个函数定义中,但这似乎不是一个优雅的解决方案
当然,我可以做#define X T1
,但通常我听到人们建议不要用#define
来做这类事情
那么什么是最好的解决方案呢?当您在返回类型中处理模板和成员typedef时,后面的返回类型真的可以节省一天的时间。你可以简单地说
template<class T>
auto A<T>::f1(Y& y) -> X& {...}
template<class T>
auto A<T>::f2(Y& y) -> X& {...}
模板
自动A::f1(Y&Y)->X&{…}
模板
自动A::f2(Y&Y)->X&{…}
成员函数名之后出现的内容将在
A
模板中查找,这意味着您不需要将A::
放在它们前面。将其完全拼写出来,因为当返回类型位于方法定义之前时,该类型将在当前命名空间中求值,不是类的方法的命名空间:
template<class T>
class A
{
typedef typename T::T1 X;
typedef typename T::T2 Y;
X& f1(Y& y);
Y& f2(Y& y);
// More declarations
};
template<class T>
typename A<T>::X& A<T>::f1(Y& y) {}
template<class T>
typename A<T>::Y& A<T>::f2(Y& y) {}
struct Foo
{
using T1 = int;
using T2 = double;
};
int main()
{
A<Foo> a;
}
模板
甲级
{
typedef typename T::T1 X;
typedef typename T::t2y;
X&f1(Y&Y);
Y&f2(Y&Y);
//更多声明
};
模板
类型名A::X&A::f1(Y&Y){}
模板
类型名A::Y&A::f2(Y&Y){}
结构Foo
{
使用T1=int;
使用T2=双;
};
int main()
{
A A;
}
但是,当我们使用尾部返回类型时,返回类型将在方法类的上下文中进行计算,因此更容易:
template<class T>
class A
{
typedef typename T::T1 X;
typedef typename T::T2 Y;
X& f1(Y& y);
Y& f2(Y& y);
// More declarations
};
template<class T>
auto A<T>::f1(Y& y) -> X& // <-- this X is a A<T>::X
{}
template<class T>
auto A<T>::f2(Y& y) -> Y& {}
struct Foo
{
using T1 = int;
using T2 = double;
};
int main()
{
A<Foo> a;
}
模板
甲级
{
typedef typename T::T1 X;
typedef typename T::t2y;
X&f1(Y&Y);
Y&f2(Y&Y);
//更多声明
};
模板
自动A::f1(Y&Y)->X&//Y&{}
结构Foo
{
使用T1=int;
使用T2=双;
};
int main()
{
A A;
}
使用X=typename MaxSimplePathVertex::X的模板代码>?或者auto A::f1(Y&Y)->X&{…}
太麻烦了?(稍微相关,示例中缺少了typename
s)。这完全有可能是我完全误解了这个问题,仅供参考)。@WhozCraig,谢谢,我修正了错误信息,但我真的不明白你的建议写在哪里。@DrorFelman我之前评论中的链接就是我所指的。有趣的。。。我不知道。从C++11或更高版本开始,这是真的吗?@Nawaz从我所知道的,从C++11.0开始,auto
a打字错误吗?因为我不明白你为什么要放两个。这是一个打字错误,奇怪的是它确实编译了!