[英]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())
,但這也不起作用。
我該如何工作?
函數的尾隨返回類型是其“ 簽名 ”(聲明)的一部分,而不是其“主體”(定義)的一部分,因此,它僅看到之前聲明的名稱。
在聲明begin
成員函數時,尚未聲明m_container
。 (請注意,該問題並不特定於模板類。)
您可以在類定義中上移m_container
的聲明(但它會迫使您將私有成員放在公共接口之前,這與通常的做法相反……)。
您可以變通與declval
:更換m_container
用std::declval<Container&>()
內decltype
: http://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.