如何返回在类中具有别名的类型的值?

时间:2018-12-23 23:11:51

标签: 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 a type
    //code
}

我如何使其工作?

4 个答案:

答案 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();
    }
};