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无关。