0
//cannot declare operator<<(...) here: 
//forward declarations: 
class External; 

template<class T, class Y> 
class External::Internal; 

template<class T, class Y> 
std::ostream& operator<<(std::ostream& out, const External::Internal<T,Y>&); 

class External 
{ 
    template<class T, class Y> 
    class Internal 
    {}; 

    Internal data_; 

    void print() { 
     /*out is a std::ostream*/ 
     out << data_; 
    } 
}; 

template<class T, class Y> 
std::ostream& operator<<(std::ostream& out, const External::Internal<T,Y>&) 
{ } 

我確實想實現operator<<Internal但,當我嘗試使用該運營商的呼叫從External一個問題:它並不認爲這是運營商在這個運營商這個類的定義下申報,而且似乎沒有宣佈上述這個類定義這種操作方式。如何申報經營者<<對內部類

+0

爲什麼ISN」 t「內部」合格嗎? –

回答

1

如果你問如何定義Internal<>::operator<<爲好友,然後:

class External 
{ 
    template<class T, class Y> 
    class Internal 
    { 
    friend std::ostream& operator <<(std::ostream& out, const Internal&) 
    { 
     // impl 
     return out; 
    } 
    }; 

    Internal<Foo, Bar> data_; 

public: 
    void print() const 
    { 
    /*out is a std::ostream*/ 
    out << data_; 
    } 
}; 
+0

@ildjarn謝謝,現在的作品。但爲了編譯,你應該從運營商 – smallB

+2

@smallB刪除模板:「*但爲了編譯,你應該從運營商*刪除模板*」咦?運算符是一個模板,顯然它必須被定義爲一個模板。這是按原樣編譯的。 – ildjarn

+0

@ildjarn不想在VS2010 sp1中編譯。 – smallB

1
template<class T, class Y> 
std::ostream& operator<<(std::ostream& out,const External::Internal<T, Y>&) 
               ^^^^^^^^^^  ^^^^^^ 
{ 

} 

,並確保該聲明功能的friend,因爲Internal是私人在External

更新: 這裏是你如何聲明友。在您的班級定義中寫入:

template<class T, class Y> 
friend std::ostream& operator <<(std::ostream& out, const External::Internal<T,Y>&) 

由於朋友聲明是聲明,所以這將解決您的前向聲明問題。

更新:爲解決循環依賴關係:

第一個正申報internal

template<class T, class Y> 
class Internal; 

然後聲明朋友。

然後你的類的其餘部分,它應該工作。

+0

@Armen我確實按照你的建議,但問題在於此操作員的前置聲明。 – smallB

+0

@small B:你什麼意思?如何聲明它的朋友? –

+1

@smallB:什麼前瞻性聲明?你的代碼不會顯示一個。 – ildjarn

0
template<class T, class Y> 
std::ostream& operator<<(std::ostream& out, const External::Internal<T, Y>&) 
{ 
} 

External::表現爲一個命名空間和是必需的因爲operator<<定義是類的外部的外部。

1

Armen的答案將工作的<<運營商本身。

然而,您的會員申報

Internal data_; 

也是不正確的,以同樣的方式。即,缺少Internal的模板參數。因此,除了修復您的運營商實施之外,還要修復您的會員聲明。

最後,請記住,在C++中,你不能,除非它已經被宣佈使用的東西。您在在線執行的print<<的使用違反了。所以你最好重新安排事物(或只是宣佈他們),這樣任何被使用時,已聲明。

乾杯& hth。,

+0

+1,當我下棋時總是我的問題 - 我專注於棋盤的一部分,而不是整個棋盤:) –

+0

否Armen的回答不起作用。 operator <<和External :: Internal之間存在循環依賴關係。問題是,在聲明之前,你不能使用這個operator <<在External中,並且你不能聲明它,因爲你必須使用不完整的類型。 – smallB

+0

@smallB:可能你遇到了一些舊版本的MSVC中的編譯器錯誤(或者對於最新的版本,沒有檢查過)?似乎在這裏至少有兩個答案給出了合適的前向聲明。 –

1

的一點是在使用前向聲明:

// you promise there will be implementation of this stuff later on: 
template<typename T, typename Y> 
class External::Internal<T, Y>; 

template<typename T, typename Y> 
std::ostream& operator<<(std::ostream& out, const External::Internal<T, Y>&); 

// now declare your class and operator<< function as normal 
class External 
{ 
    template<class T, class Y> 
    class Internal 
    { 
    }; 

    Internal<Foo, Bar> data_; 

    void print() 
    { 
     // here you can use operator<< with Internal 
     out << data_; 
    } 
}; 

template<class T, class Y> 
std::ostream& operator<<(std::ostream& out,const External::Internal<T, Y>&) 
{ 
} 
+0

並且您是否嘗試編譯它?嘗試一下。 – smallB

+0

對。 「內部」是私人的,我沒有意識到這一點。正如其他人所建議的那樣,在這種情況下,宣佈「朋友」功能可能是最好的選擇。 – Fiktik

0

有問題當我嘗試使用此外部操作員呼叫時

不要在您的類定義中編寫程序代碼。只有聲明。

寫入,爲了:

  • 類定義[在報頭]
  • operator<< [在報頭]使用這些東西[在源文件]
  • 代碼