2012-11-25 24 views
12

için 'int' parametresini dönüştürmek ve içinde aşağıdaki kodu edilemez:Ben ++ ders Pluralsight C takip ediyorum 'int &'

#include <iostream> 

template <class T> 
T max(T& t1, T& t2) 
{ 
    return t1 < t2 ? t2 : t1; 
} 

int main() 
{ 
    std::cout << "Max of 33 and 44 is " << max(33, 44) << std::endl; 

    return 0; 
} 

Ben bu kod parçasının üzerinde yazdığınız ama kodun aksine tabii ki, bir hata mesajı alıyorum:

mayın Visual Studio Ultimate 2010.


yazılır iken kursuna kodu Visual Studio Express 2010 yazılır

C2664: 'max' : cannot convert parameter 1 from 'int' to 'int &' 

EDIT

Herkese (Kate Gregory'nin kendisi gibi) cevaplar vermesi ve her şeyi temizlemesi için teşekkür ederiz.

+0

Kursa bir linkiniz var mı? Bu _exact_ kodu bu dersten mi? –

+0

Ders, ilk kısım olan Pluralsight C++ temelleri olarak adlandırılır. Tam kod budur. Ayrıca, dizeleri ve kullanıcı tanımlı bir sınıfı kullanan maksimum kod da vardır, ancak tam olarak maksimum işlevin gösterilmesini sağlayan tamsayılarla hiçbir ilgisi yoktur. –

cevap

30

Hazırlıklar (ve genel olarak sıralamalar), yerleşik olmayan başvuru tarafından iletilemez (çünkü, arayanın bunları değiştirip değiştiremeyeceğini anlamış olmaz).Her iki değer ile veya const referans ile bu geçiş:

template <class T> 
T max(const T& t1, const T& t2) 
{ 
    return t1 < t2 ? t2 : t1; 
} 

veya

template <class T> 
T max(T t1, T t2) 
{ 
    return t1 < t2 ? t2 : t1; 
} 
3

Geçici değeri T& olarak geçemezsiniz. Eğer argümanları değişmez beri const T& kullanmak yerine

BTW, orada yerleşik olan max fonksiyonu size referans olarak parametrelerle işlevi tanımlı ise, söz konusu parametreler için değişken isimleri başka bir şey kullanamazsınız

+0

Evet, derste max. Şablonun nasıl kullanılacağını gösteren basit bir demodur. –

2

- ve sayıları kullanmaya çalışıyorsun.

4

Hem 33 hem de 44, r değerleridir; referansa göre değil, işleve geçirilirler. Derleyici bu ikisini beklenen tip int &'a dönüştürebilir. Kullanım değişkenler referans olarak geçirilebilir olarak (Sol taraf):

int a = 33, b = 44; 

max(a, b); // 44 

sen sadece burada temel tipleri (int) ile uğraşıyoruz yana, referans olarak geçen yedekli değil. değeriyle geçen bir kopyasını neden olur, ancak farkı önemsiz olacaktır:

template <class T> 
T max(T t1, T t2); 

Burada SağDeğerler ve SolDeğerler hem geçebilir. Ancak, , sınıfının bir nesnesini geçebilme şansı var. Bu durumda referans ile geçilmesi önerilir. Bir tarafından argümanlar iletebilirsiniz

template <class T> 
T max(T const &t1, T const &t2); 

C++ 11:

Ama

Bir kopyaya istiyoruz ve hem SolDeğerler ve SağDeğerler istemiyoruz durum için, biz const referans ile geçebilir evrensel referans
biz bağlamak, böylece glvalues: orijinal kod lvalue başvuru sözdizimi tutmak istiyorsanız

template <class T> 
T max(T&& t1, T&& t2); 

int main() 
{ 
    int a{0}, b{0}; 

    max(a, b); 
    max(1, 2); 
} 

, bu lvalue dolgusu kullanabilirsiniz:

template<typename T> 
T& lvalue(T&& t) 
{ 
    return t; 
} 

int main() 
{ 
    max(lvalue(1), lvalue(2)); 
} 
3

tamsayı sabitleri const olmayan referans olarak kabul edilemez. Ayrıca, sizin max fonksiyon const referanslarla çalışabilir, bu yüzden onları uygun şekilde işaretlemek:

T max(const T& t1, const T& t2) 
4

burada cevap size testinde kullanmıyordu ilgisiz kodunda yalan çıkıyor. Kesinlikle benim küçük max() değeri ya da const-ref almalıdır ve bu mümkün olduğunca çabuk düzelteceğim bir beyin kaymasıydı.

Ancak tüm demo kodu güzel çalışıyor. Bunun nedeni, daha fazla başlık içermesidir, bunlardan biri xutility ve dolayısıyla std::max. Bu benim max benim kullanılmadığını fark etmeme neden oldu. Tekrar olanları ortadan kaldırmak için demoyu biggest gibi bir adla yeniden yapacağım. Ve bu arada, evet, eğer değişmezleri referansa göre bir işleve geçirmek istiyorsanız, onlar referans olarak kabul edilmelidir. Bunu biliyordum, ama test kablolarını yazarken bunu düşünmedim ve kötü kodun işe yaradığı zaman kandırdım. Kodu daha dikkatli bir şekilde tekrar okumalıydım: bunu dikkatimi çektiğiniz için teşekkürler. (Ve kursu aldığınız için teşekkürler ve umarım yararlı bulursunuz.)

+1

:-) Cevabınız için çok teşekkürler! Ve evet, kursu faydalı buluyorum. C# 'yı yıllardır kullanıyorum ve her zaman C++' yı denemek istedim ama ... korktum mu? Tabii ki kolayca girmeme izin ver. –

+1

Yanlışlıkla 'std :: max' yerine kendi 'max'ınızı çağırmak problemi,' kendi adınızdaki bir yerde namespace std 'kullanarak mümkündür. [Bunun çok kötü bir fikir olduğunu biliyoruz] (http://stackoverflow.com/questions/1452721/). Yazıklar olsun! ;) – fredoverflow

+1

:-) Bir başlık dosyasında kötü bir fikir - bu da bir .cpp dosyasında sizi ısırdığını göstermeye gider. –

2

Küçük bir not. İlk fonksiyon kodunuzu "max" 'dan kullanabilirsiniz. max(34, 44)'dan max<const int>(34,44) numaralı telefonu aramayı deneyin. Bazen yararlı olabilir.

#include <iostream> 

template <class T> 
T max(T& t1, T& t2) 
{ 
    return t1 < t2 ? t2 : t1; 
} 
int main() 
{ 
    std::cout << "Max of 33 and 44 is " << max<const int>(33, 44) << std::endl; 
    return 0; 
} 
+0

Henüz buna rastlamayın. Teşekkürler. –

İlgili konular