2010-12-13 28 views
5

Neden bu kodun derlenemediğini bilmiyorum. Visual C++ 2010 ve gcc -std = C++ 0x ile test ettik. kimse biraz öneri veriyor? teşekkürler!C++ 0x başvuru çökmesi hakkında soru

template<typename T> 
class Foo 
{ 
public: 
void test(const T&){cout<<"const";} 
void test(  T&){cout<<"non const";} 
}; 

int main() 
{ 
int a; 
Foo<int&> f; 
} 

derleme hatası: 'hükümsüz Foo :: testi (T)': üye işlevi zaten tanımlı veya

bildirilen, ancak bu yüzden derlenmiş edilebilir?

template<typename T> void foo(const T&){cout<<"const"; } 
template<typename T> void foo(T&){cout<<"non const"; } 
int main() 
{ 
    int a; 
    foo<int&>(a); 
} 

i'v C++ 0 x makale okumak bahsedilen T & & == T &, yani const T & & == const T &?

cevap

8

Bu: Bir referans bir türüne uygulanabilir

class Foo<int&> 
{ 
public: 
void test(int&); 
void test(int&); 
}; 

const no-op:

Foo<int&> f; 

bu örnekleme sebebiyet verir. Bir statik olmayan üye işlevi, bir referans veri üyesinde faaliyet ile karşılaştırın:

struct A { 
    int &ref; 

    // valid: const member function doesn't treat "ref" as "const int&". 
    void operate() const { 
    ref = 0; 
    } 
}; 

Sen hedefe ulaşmak için Foo<...> için int geçmek zorunda.

13

i'v read c++0x article said: T& & ==T& , so const T& & == const T& ?

Aslında bu pek bir anlam ifade etmiyor. IMHO, bir tabloya koymak daha iyidir:

T  T&  const T  const T& 
--------------------------------------- 
int  int& const int const int& 
int& int& int&   int& 
     (1)  (2)   (1+2) 

1: Reference collapsing in action 
2: const applies to the reference and is therefore ignored 

T zaten referans (2 satır) const T const hakeme referans için geçerlidir ve değilse. Fakat bir referans, başlatmadan sonra başka bir nesneyi gösteremeyeceğiniz anlamda, içsel olarak sabittir, bu nedenle const burada göz ardı edilir. Bunu "const çökme" olarak düşünebilirsiniz. ;-)

1

İkinci soru için, iki örneklenen işlev aynı parametre türüne sahiptir ve her ikisi de şablonlardır (eğer bir şablonsa, diğeri şablon olmayan bir işlevse, aşırı yük çözünürlüğü daha sonra birini seçecektir)), bu yüzden aşırı yük çözünürlüğü daha uzman olan şablonu seçecektir. Genel olarak T & konstrüksiyonu, T &'dan daha uzmanlaşmış bir tiptir, böylece ilk şablon işlevi çağrılır.