簡體   English   中英

如何使用帶模板的類成員的尾隨返回類型

[英]How to use trailing return type with a templated class member

我正在嘗試實現以下類:

template <typename Container>
class reverse_adaptor
{
public: // Construction
    reverse_adaptor(Container &container) :
        m_container(container)
    {}

public: // STL container static polymorphism
    auto begin() const -> decltype(m_container.rbegin())
    {
        return m_container.rbegin();
    }

    auto end() const -> decltype(m_container.rend())
    {
        return m_container.rend();
    }

private: // Members
    Container &m_container;
};

我使用尾隨返回類型的原因是因為我不知道m_container是否為const,所以我讓編譯器為我解決。 但是,出現以下編譯器錯誤:

/Users/mark/Blah/Stdx.h:77:40:“stdx::reverse_adaptor>>”中沒有名為“ m_container”的成員

我認為這可能與模板類型的多階段傳遞有關,因此將其更改為decltype(this->m_container.rbegin()) ,但這也不起作用。

我該如何工作?

范例-http://ideone.com/ekVYlH

函數的尾隨返回類型是其“ 簽名 ”(聲明)的一部分,而不是其“主體”(定義)的一部分,因此,它僅看到之前聲明的名稱。

在聲明begin成員函數時,尚未聲明m_container (請注意,該問題並不特定於模板類。)

  • 您可以在類定義中上移m_container的聲明(但它會迫使您將私有成員放在公共接口之前,這與通常的做法相反……)。

  • 您可以變通與declval :更換m_containerstd::declval<Container&>()decltypehttp://ideone.com/aQ8Apa

(如評論中所述,在C ++ 14中,您可以刪除尾隨的返回類型,而只需使用decltype(auto)作為“常規”返回類型。)


附錄:關於為什么可以在成員函數的類內主體中使用尚未聲明的成員,但不能在尾隨返回類型中使用的原因,原因如下:

class Foo {
public:
    auto data() const -> decltype(m_data)
    {
        return m_data;
    }
private:
    SomeType m_data;
};

將是[免責聲明:非正式用語!]這種“由編譯器重寫”的形式,它等同於以下內容:

class Foo {
public:
    inline auto data() const -> decltype(m_data); // declaration only
private:
    SomeType m_data;
};

// at this point, all members have been declared

inline auto Foo::data() const -> decltype(m_data) // definition
{
    return m_data;
}

在聲明之前不能使用名稱的地方(第一個decltype(m_data)違反)。

聲明函數時尚未引入名稱m_container 切換聲明的順序,代碼將起作用。

這里查看工作版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM