2015-07-21 19 views
8

Kodumda std::shared_ptr ile birlikte Image<T> işaretli bir resim sınıfı kullanıyorum. Bu görüntü işaretçilerinin, bazıları görüntü türünden bağımsız olan çeşitli görüntü işleme işlevlerine geçirilmesi gerekiyor. Aşağıdaki Image<T> tanımını ve iki işlem işlevi function1() ve function2()'u düşünün. function1() ve function2() etkili aynı imzaya sahip ikenBağımlı Türler: Şablon bağımsız değişken kesintisi başarısız oldu

#include <memory> 

template <typename T> 
struct Image 
{ 
    typedef std::shared_ptr<Image<T>> Ptr; 
}; 

template <typename T> 
void function1 (typename Image<T>::Ptr image) {} 

template <typename T> 
void function2 (std::shared_ptr<Image<T>> image) {} 

, function1() okumak daha kolaydır ve işaretçi nasıl gerçekleştiğine ayrıntılarını gizler. Ancak, şablon türünü açıkça belirtmeden function1() numaralı telefonu arayarak sorun yaşıyorum.

example.cc: In function 'int main()': 
example.cc:18:19: error: no matching function for call to 'function1(MyClass<int>::Ptr&)' 
example.cc:18:19: note: candidate is: 
example.cc:10:6: note: template<class T> void function1(typename MyClass<T>::Ptr) 
example.cc:10:6: note: template argument deduction/substitution failed: 
example.cc:18:19: note: couldn't deduce template parameter 'T' 

Sorum şudur:

int main (void) 
{ 
    Image<int>::Ptr image = std::make_shared<Image<int>>(); 
    function1(image);  // Does NOT compile 
    function1<int>(image); // Does compile 
    function2(image);  // Does compile 
    return 0; 
} 

İlk arama derleme hatasına yol açar: Aşağıdaki kodu düşünün elle belirtmek zorunda kalmadan function1() imzasını kullanmak mümkün mü şablon argümanı? Derleyici hatasına neden olan nedir?

Sorun, Image<T>::Ptr bağımlı bir tür olduğu gerçeğinden kaynaklandığından şüpheleniyorum. Böylece derleyici derleme zamanında bu alanın tam tanımını bilemez. Derleyiciye alanın bir türü olduğunu söyleyen typename anahtar kelimesinin ruhuyla bu alanın uzmanlıklarının olmayacağını söylemek mümkün mü? olmayan bir çıkarılabilir bağlamda T kullanılarak

cevap

7

What is causing the compiler error?

Sen (yalnızca): iç içe-name-belirteci s. Yani, T'u, yalnızca türün içinde bulunduğu yeri belirten bir adın içine koyarsınız. Derleyici gerçek niyetinizi anlayamaz ve çok fazla T 'sini denemek zorunda kalır.

Is it possible to use the signature of function1() without having to manually specify the template argument?

Gerçekten değil. Size

template <typename U> 
void function1(ImagePtr<U> p) {} 
+0

"gerçekten" ile:

template <typename T> using ImagePtr = std::shared_ptr<Image<T>>; 

Ve thusly function1 yazma: Bir Görüntü akıllı pointer atıfta arasında daha kısa bir yol istiyorsanız, gerçi bir takma şablonunu kullanabilirsiniz "hayır" demek değil mi? – Barry

+0

@Barry İyi, VC++ 'daki bir insanın hata yapıp yapmadığını kontrol etmedim, ama evet - hayır. – Columbo

İlgili konular