【问题标题】:How to correctly define a template class return type of a template function?如何正确定义模板函数的模板类返回类型?
【发布时间】:2021-12-11 22:31:02
【问题描述】:

我正在尝试做的事情相当简单。我有一个带有通用有效负载的模板类PayloadResult<T>,在另一个类中有一个返回此类对象的模板函数。

class Result
{
public:
    template<class TPayload>
    PayloadResult<TPayload> success(TPayload payload) { return PayloadResult<TPayload>(payload); }
}



template <TPayload>
class PayloadResult
{
private:
    TPayload payload_;

public:
    PayloadResult(TPayload payload)
    {
        payload_ = payload;
    }

    TPayload payload()
    {
        return payload;
    }
}

编译器告诉我success函数的返回类型是No template named 'PayloadResult'

我将返回类型签名更改为 std::array 并且它起作用了。我究竟做错了什么? (我是 C++ 的新手)

非常感谢!

【问题讨论】:

  • 在声明之前不能使用PayloadResult。交换类的顺序。
  • 另外,template &lt;TPayload&gt; 不是有效的语法。你想要template &lt;typename TPayload&gt;
  • @Frank 对,忘记了,谢谢!
  • @NathanOliver 如果 PayloadResult 继承自 Result 会怎样?
  • 你可以转发声明它,但奇怪的是基类需要派生类才能存在。

标签: c++ function class templates generics


【解决方案1】:

Below 是更正的示例。您必须转发声明类模板 PayloadResult 以将其用作返回类型,就像您在示例中所做的那样。其次,TPayload 前面没有关键字 typenameclass

//forward declare the class template PayloadResult
template <typename TPayload> class PayloadResult;

class Result
{
public:
    template<class TPayload>
    PayloadResult<TPayload> success(TPayload payload) { return PayloadResult<TPayload>(payload); }//now this won't give error because you have forward declared 
};


//added typename
template <typename TPayload>
class PayloadResult
{
private:
    TPayload payload_;

public:
    PayloadResult(TPayload payload)
    {
        payload_ = payload;
    }

    TPayload payload()
    {
        return payload;
    }
};
int main()
{
    return 0;
}

【讨论】:

  • 感谢转发声明信息。不知道那个。
  • 现在如果我将success设为静态并尝试auto r = Result::success(0.1);,编译器会显示In template: implicit instantiation of undefined template 'PayloadResult&lt;double&gt;'
  • 没关系,我把它放在命名空间之外,它现在可以正常工作了。再次感谢!
  • @rombas 是的,那是因为我们只转发了“声明”PayloadResult&lt;&gt; 模板。请注意我上一句中的“声明”一词。这意味着我们还没有定义它,这是编译器错误所说的。
  • @rombas 不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2012-06-21
  • 1970-01-01
  • 2018-02-21
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多