2011-12-04 18 views
10

Sınıflarımdan birinde operatöre < < aşırı yüklenmesini istiyorum. imza şöyledir:C++ - arkadaş dosyalarının başlık dosyasında tanımlanması gerekir mi?

friend std::ostream& operator<<(std::ostream& os, const Annuaire& obj) 

ben .h bunu tanımladığınızda, .cpp tanımlamak o operatörün < < tam ancak 1 argüman alır söylüyor dosyaya deneyin, bu derlenmiş /iyi çalışıyor.

std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ // ... } 

o başlık dosyalarında tanımlanabilir gerek arkadaş fonksiyonları ile ilgisi var mı:

Bu benim .cpp dosyasında tanımlamak nasıl?

+0

Sen ostream' ve 'istream' sağ ... –

+0

evet, arkadaşın istream olduğunu ve kasıtlı olduğunu size 2 arkadaş bildirimleri ve 2 tanımlarını gerekir eğer cpp'de bir, ostream olan' almak zorunda değilse, bir ya da diğerini düzeltin ya da dışarı akışını istiyorsanız –

+0

. Teşekkürler, bu bir kopya-yapıştır hata oldu zaten. Ekteki ad alanına bir not eklemek için – Pacane

cevap

9

, ama en az bir başlık dosyasında ilan olması gerekiyor: Böyle bir şey olmalı Akışın kendisinin size verdiği şeyleri gör, aşırı yükünüzü değil.

// .h and in class 
friend std::ostream& operator<<(std::ostream& os, MyClass const& v); 

// .cpp 
std::ostream& operator<<(std::ostream& os, MyClass const& v){ 
    // print it 
} 
2

Böyle bir kısıtlama yok; Muhtemelen yanlış yazıyorsun. Bunu kullanmak isteyen sadece edecek aksi takdirde tüm yerler, O bir cpp dosyasında tanımlanmış olabilir

class Foo 
{ 
    int n; 

    friend std::ostream & operator<<(std::ostream &, Foo const &); 
}; 

std::ostream & operator<<(std::ostream & o, Foo const & x) 
{ 
    return o << x.n; 
} 
9

Sorun, tanımladığınız yoldur. Sınıfın bir üyesi değil, sınıfın sadece arkadaş. Annuaire:: önekini bırakmanız gerekiyor. Yani, bu değiştirin:

std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ // ... 

Buna:

std::ostream& operator<<(std::ostream& os, const Annuaire& obj){ // ... 

hata mesajı sebebi Annuaire::operator<<(std::ostream& os, const Annuaire& obj) üç argüman beklenebilir ki: o (this gibi) üzerinde deniyor o Annuaire örneği ve ve iki ek argüman (os ve obj).

3

görünse bile arkadaş işlevleri, üye işlevleri değil, ad alanı düzeyi işlevleri (kapsayıcı ad alanında) değil, üye işlevleridir. Kodunuzda doğru arkadaş işlev bildirmek, ancak sınıfın üyesi fonksiyonu olarak tanımlamak deneyin: operator<< denilen

std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ 

Bu tanım Annuaire üyesi işlev için olurdu, iki argüman alır, operator<< olarak geçersiz olan, iki yoldan biriyle aşırı yüklenebilir: iki argüman (sol taraf ve sağ taraf) alan bir serbest fonksiyon olarak veya ifade argümanını alan ifadenin lhs'ında görünen sınıfın bir üye işlevi olarak rhs tipi. David'in cevapta belirtildiği üzere operatör bir değil bu durumda,

std::ostream& operator<<(std::ostream& os, const Annuaire& obj) 
+0

+1. Gerçek fonksiyon tanımından önce 'isim ismininin kullanılması 'yeterli değildir. – moooeeeep

2

: lhs std::ostream ve bunu değiştiremezsiniz çünkü bu özel durumda, ücretsiz bir fonksiyonu kullanılarak tek seçenek ile bırakılır üye işlevi, aynı ad alanında sadece bir arkadaş işlevidir. Bu bana çok benzer bir sorunu çözmede doğru yönde işaret etti.

Bu cevabı şu anda gönderiyorum çünkü bana hemen açık değildi. Belki de operatörü eklediğim uygulama dosyası tam olarak ad alanına eklenmemiş ve bunun yerine bir kullanım yönergesi kullanmıştır.

Uygun olmamalı ama VS2013 kullanıyorum.

//Foo.h 
namespace Bar{ 
    class Foo 
    { 
    public: 
     Foo(); 
    private: 
     int n; 
     friend std::ostream & operator<<(std::ostream &, Foo const &); 
    }; 
} 

//Foo.cpp 
using namespace Bar; //won't apply to the operator definition 
Foo::Foo(){}// doesn't require the Bar qualifier because of the using-directive 

//the operator required the Bar namespace qualifier 
std::ostream & Bar::operator<<(std::ostream & o, Foo const & x) 
{ 
    return o << x.n; 
} 
+0

Tam olarak benim sorunum! Bunun neden böyle olduğuna emin değilim. – Flynsee

İlgili konular