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
"gerçekten" ile:
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@Barry İyi, VC++ 'daki bir insanın hata yapıp yapmadığını kontrol etmedim, ama evet - hayır. – Columbo