2011-03-19 21 views
7

Beklendiği gibi çalışmıyor, yapıcı ile ilgili bir sorunum var.Oluşturucu kullanılabilir nesneyi iade etmiyor

Ben böyle benim sınıf başlatmak için çalışırsanız, bu iş olacak ve ben bir kullanışlı nesneyi almak: Ben aşağıdaki gibi bir sınıf (eşdeğer olmalıdır) inşa etmeye çalışırsanız, ancak

vector<float> v; 
MyClass<2> a(v); 

sonuç oldukça beklenmedik. Programı derlerken veya çalıştırırken hata mesajı/uyarısı yoktur. Ancak bu değişkeni bir yerde kullanmaya ve yöntemlerini çağırmaya çalışırsanız (örneğin a.doSomething()), çökecektir.

Kullanıldıysa beni bilgilendirmek için kurucunun içine biraz kod koydum. Bu durumda, kurucunun içinde hiçbir kodun gerçekte yürütülemediği ortaya çıktı.

MyClass<2> a(vector<float>()); 

Bu yüzden neden böyle olduğunu merak ediyorum? 2. bildirim yasadışı mı?

DÜZENLEME: sınıfının bazı kodlar

template <int x> 
class MyClass { 
public: 
    vector<float> v; 
    MyClass<x>(vector<float> v1) { 
     v = v1; 
    } 

}; 
+0

The clas s aynı türde bir kamu değişkenine sahiptir. Bu yüzden sadece argümanı değişkene atayacaktır. – dominos

+0

Bazı kodları yayınla MyClass! – Nawaz

+0

Sınıfın bazı kodlarını yayınladım. Bir referans veya işaretçi değil, sadece bir değişken. – dominos

cevap

18
MyClass<2> a(vector<float>()); 

Bu değişken beyan değildir yayınlayacağız. Bu, nesnesini döndüren ve argüman olarak "vector<float> döndüren bir işlevin göstergesini" olarak alan a adlı bir işlevin bildirisidir. Kafa karıştırıcı? Evet. Bu "en çok rahatsız edici ayrışma" olarak adlandırılan şeydir. senin yapıcı değildir explicit olduğundan

MyClass<2> a = MyClass<2>(vector<float>()); 

Veya şunu kullanabilirsiniz:

MyClass<2> a = vector<float>(); 

MyClass<2> a((vector<float>())); 
      ^   ^

Veya, kopya başlatma kullanabilirsiniz:

Fazladan parantez gerek

(vector<float> nesneleri için örtülü olarak converti olmak istemediğiniz sürece MyClass<N> nesnelere ble, muhtemelen bu yapıcı explicit yapmak istiyorum.)


İyi derleyici bu tür bir şey hakkında uyarmak gerekir. Visual C++ uyarır:

uyarı C4930: 'MyClass<x> a(std::vector<_Ty> (__cdecl *)(void))': örneklenmekte fonksiyonu olarak adlandırılır değildir (bir değişken tanımı amaçlanan mi?)

Clang uyarır:

uyarı: parantez olarak belirgin hale edildi bir işlev belirteci

+0

neden MyClass <2> a ((()))? Bu, MyClass <2> a ile aynı olmamalıdır (vektör ())? – BlackBear

+0

@BlackBear: Ek parantezler ile geçerli bir işlev bildirimi değildir, bu nedenle doğrudan başlatıcı ile değişken bir bildirim olarak ayrıştırılır. –

+0

anladı. teşekkürler :) – BlackBear