Üzgünüz, bu genel bir soru gibi görünüyor, aradığım yanıtın cevabını bulana kadar bulamadım. En yakın sonrası olacağını bu bir: Template Specialization for basic POD onlyŞablon operatör yüklenmesinde aşırı yüklenme yok
ı bir sınıf template <class T> class A {...};
var ve ben bir iç ikili operatör (tip A iki nesne) olarak operatör + aşırı istiyoruz ve tip karma bir ikili operatör olarak (nesne diyelim A ve sayısal POD tipi).
#include <type_traits>
using namespace std;
// Declare/fine template
template <class T> class A {...};
// Internal binary operator
template < class T, class U >
A< typename common_type<T,U>::type >
operator+ (const A<T> &a, const A<U> &a) { ... }
// Mixed binary operator
template < class T, class U >
A< typename common_type<T,U>::type >
operator+ (const A<T> &a, const U &b) { ... }
Ama ikinci tanım ilkinden çatışma halinde olduğu gibi o zaman görünüyor:
İdeal olarak, yazdıklarıma istiyorum olduğunu. İkinci tanımı kullanarak, U'nun sayısal bir POD tipi olduğundan emin olmanın yolunu biliyorum. Eğer bu şekilde gidersem sorun şu ki, eğer temelde A şablonunda bulunan altta yatan şablon tipinin ne olduğunu bilmemizin bir yolu yok.
Lütfen bana sorumun yeterince açık olup olmadığını söyle ve şimdiden teşekkürler! :)
DÜZENLEME: Şablon belirtimi, son filtremde "A<T>
ise U" ifadesiyle silinmiştir. Kısacası, T'nin saklı olduğunu söylüyorum. Bu hemen canlı kümesinden ikinci aşırı dışlar
#include <type_traits>
// "A" template
template <typename> class A {};
// Traits for "A-ness":
template <typename> struct is_a : std::false_type { };
template <typename T> struct is_a<A<T>> : std::true_type { };
// Operators:
template <class T, class U>
A<typename std::common_type<T, U>::type>
operator+(const A<T> & a, const A<U> & b);
template <class T, class U,
typename = typename std::enable_if<!is_a<U>::value>::type>
A<typename std::common_type<T, U>::type>
operator+(const A<T> & a, const U & b);
ve getiri belirleme yüzden sorun:
'şablon U> :: değeri geçersiz> :: türü> bir :: türü> işleç + (const A & a, const U &b); 'hile yapmalıdır. –
Morwenn
" Altta bulunan şablon türü "ile ne kastediliyorsunuz? Dahili kullanıcı olduğu için, karışık işleç, U'nun" A "olması durumunda seçilemez Daha iyi bir eşleşme. İç operatörde 'A < A> 'davayı ele almak ister misiniz? –
pmr
Yardımlarınız için hepinize teşekkür ederiz. pmr, haklısınız, sorun aslında daha önce gerçekleşir, çünkü common_type. 'A' ve U arasında yazıyoruz, biz En iyi maçtan önce bortu değerlendirilebilir. Morwenn, çözümün denediğim bir şeye benziyor, ama bu bağlamda yanlış; S ile 'A
' olabilir!= T ve hala operasyonu yapabilmem gerekir. – Sheljohn