我有一个模板化类和一个别名类型。我想将此类型用作成员函数的返回值,但它不能编译。
//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
}
我如何使其工作?
答案 0 :(得分:1)
通过以下方式更改foo
的定义:
template<class T>
typename Test<T>::testing Test<T>::foo() {
}
或什至不如@ Jarod42所建议的那样冗长
template<class T>
auto Test<T>::foo() -> testing {
}
您还应该阅读Why can templates only be implemented in the header file
答案 1 :(得分:1)
应避免在头文件中使用指令,因为通常它们会在较大的代码库Is it wrong to use C++ 'using' keyword in a header file?
中带来麻烦但是我在这里看到的真正问题是,您尝试将模板类的实现拆分为一个cpp文件。只能这样做,分别。链接,如果您在变通方法上走了很长一段路,大多数开发人员会认为这是错误的做法,或者至少是意外的/不需要的https://www.codeproject.com/Articles/48575/%2FArticles%2F48575%2FHow-to-define-a-template-class-in-a-h-file-and-imp
所以我想说把实现放到头文件中,不要在那儿使用using,这样很好,这是实现模板类的预期方式。
您可以使用typedef来使自己的生活更轻松,并为他们起个更好的名字。
答案 2 :(得分:0)
模板方法必须在标头中实现。
答案 3 :(得分:0)
testing
并不意味着任何意义,除非它与Test相关联
您需要将两者都放在头文件(file.h
)中,并且在同一类中声明这些函数会更容易:
template<class T>
class Test {
public:
using testing = T;
T value;
testing foo()
{
return testing();
}
};