Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用typedef–;基于类的模板参数–;类外范围_C++_Templates_Parameters_Typedef - Fatal编程技术网

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打字错误吗?因为我不明白你为什么要放两个。这是一个打字错误,奇怪的是它确实编译了!