C++ 如何返回类中别名类型的值?

C++ 如何返回类中别名类型的值?,c++,C++,我有一个模板类和一个别名类型。我想将此类型用作成员函数的返回值,但它不会编译 //file.h template<class T> class Test { public: using testing = T; T value; testing foo(); }; //file.cpp template<class T> testing Test<T>::foo() { //error 'testing' does not name

我有一个模板类和一个别名类型。我想将此类型用作成员函数的返回值,但它不会编译

//file.h
template<class T>
class Test {
public:
    using testing = T;
    T value;
    testing foo();
};

//file.cpp
template<class T>
testing Test<T>::foo() { //error 'testing' does not name a type
    //code
}
//file.h
模板
课堂测试{
公众:
使用测试=T;
T值;
测试foo();
};
//file.cpp
模板
测试::foo(){//error“testing”未命名类型
//代码
}

如何使其工作?

必须在标题中实现模板方法。

通过以下方式更改
foo
的定义:

template<class T>
typename Test<T>::testing Test<T>::foo() {
}
模板
typename测试::测试测试::foo(){
}
或者像@Jarod42所建议的那样更不冗长

template<class T>
auto Test<T>::foo() -> testing {
}
模板
自动测试::foo()->测试{
}

此外,您还应该阅读

测试
没有任何意义,除非它与测试相关

您需要将这两个函数都放在头文件(
file.h
)中,并且在同一个类中声明这些函数时更容易:

template<class T>
class Test {
public:
    using testing = T;
    T value;

    testing foo() 
    {
        return testing();
    }
}; 
模板
课堂测试{
公众:
使用测试=T;
T值;
测试foo()
{
返回测试();
}
}; 

应避免在头文件中使用指令,因为它们通常会在较大的代码库中带来麻烦

但我在这里看到的真正问题是,您试图将模板类的实现拆分为一个cpp文件。这只起作用。链接,如果你走了很长的路与解决方案,大多数开发人员会考虑不良实践或至少意外/不必要的

所以我想说,将实现放在头文件中,不要在那里使用using,这样就可以了,这将是实现模板类的预期方式


相反,您可以使用typedef来让您的生活更轻松,并给事物起更好的名字。

模板自动测试::foo()->使用名称空间测试
!=
typedef
(即使使用
也不例外)。我不是说不能使用using,我是说在头文件中使用using是不好的做法。我并不是说它和typedef是一样的,但是如果你真的喜欢typedef std::list type,它是一种让你的生活更轻松的有效方法;我的意思是OP不使用
使用名称空间
,所以这很好(在类中使用别名是常见的做法,也不错)。这就像你说我们应该避免以双下划线开头的名字作为保留。即使是真的,也与不使用它的OP无关。