2012-12-17 48 views
1

這裏是一個攝製情況:如何在只有參考時正確地寫入 - >運算符?

#include <iostream> 

template< class MessageType > 
class Augmented 
{ 
public: 
    Augmented(const MessageType& message) 
     : m_message(message) 
    {} 

    const MessageType* operator->() const { return &m_message; } 

private: 
    const MessageType& m_message; 
}; 

template< class MessageType > 
Augmented<MessageType> augmented(MessageType&& message) 
{ 
    return Augmented<MessageType>(std::forward<MessageType>(message)); 
} 

class Test 
{ 
public: 
    void print() const { std::cout << "Hello World" << std::endl; } 
}; 


int main() 
{ 
    Test test; 

    auto augmented_test = augmented(test); 
    augmented_test->print(); 

    return 0; 
} 

我使用VS2011(更新一)。 當我嘗試使用使用的代碼 - >運營商,我得到這個錯誤:

error C2528: '->' : pointer to reference is illegal

我理解錯誤,但我不覺得是如何避免在這種特殊情況下。 我只需要一個指向由成員引用推斷的對象的指針。我嘗試了幾種不同的語法,導致了相同的錯誤。

任何想法如何正確地寫這個操作符?


注意保持對這個問題的焦點:我voluntarly使用參考,以避免不應該在非常特殊的和孤立的情況下使用該助手代碼發生複印件;問題不在於班級的設計。


最後修改:將問題代碼替換爲完整的repro格。 DeadMG是現貨,所以我接受他的回答。更確切地說:輔助函數(augmented())將MessageType轉發爲Test&而不是Test,這是錯誤的。有幾種方法可以解決這個問題,最簡單的方法是讓助手功能不轉發類型,但只需要一個const MesssageType&

+1

對我很好。該錯誤與您的參考無關。你如何使用操作員? –

+0

正確,更新了更多的信息。 – Klaim

+0

但帶有錯誤的信息。此代碼仍然有效。你可以創建一個MWE嗎? –

回答

3

此代碼對任何特定值類型都是非常合法的。不過,我懷疑你已經通過引用來實例化它。這將導致const MessageType*擴展到const (T&)*,這是不合法的。您需要檢查模板參數不是參考。

+0

const typename std :: remove_reference type * operator - >()const {return&m_message; ''也許。 ('#include ',C++ 11頭文件,現在很常見) – Yakk

+0

@DeadNG我添加了調用代碼和我用來創建對象的幫助函數。 – Klaim

+0

@DeadMG我認爲helpfer函數創建對象可能是錯誤的......也許刪除完美的轉發?或者甚至刪除函數... – Klaim