2015-04-17 28 views
14

Neden clang ile derlemek aşağıdaki gelmez ama g++ 4.9Standart argüman [Clang evet, GCC hiçbir]

#include <array> 

template< typename T1, typename T2 , typename T3 = int> 
struct A; 

template<typename T, unsigned int N, typename T2, typename T3> 
struct A< std::array<T,N>, T2, T3 > { 
    int a; 
}; 

int main() 
{ 
    A< std::array<int,10>, double> a; 
    a.a +=3; 
} 

http://coliru.stacked-crooked.com/a/c7800f49ba5aac43

g uygun bir ihtisas bulamazsa ++ ve eksik" ile şikayet "yazın. Ben, varsayılan argüman typename T3 = int uzmanlığına başvurmak gerekir çünkü merak ediyorum (veya sadece tam uzmanlaşma için geçerlidir?)

+10

Eğer 'yerine' std :: size_t' imzasız int' kullandığınız için. İkincisi ile, her iki derleyici programı kabul eder. – dyp

+1

İlgili: http://stackoverflow.com/q/21740896/ – dyp

+1

Olabilir https://llvm.org/bugs/show_bug.cgi?id=16279 – dyp

cevap

4

şablonları A<T1, T2, T3> ve A<T1, T2> Üyelerinize kullanamazsınız öyleyse, çözebilir tanımlı tamamlayın değildir

#include <array> 

template< typename T1, typename T2 , typename T3 = int> 
struct A { 
    int a; 
}; 

template<typename T, unsigned int N, typename T2, typename T3> 
struct A< std::array<T,N>, T2, T3 > { 
    int a; 
}; 

int main() 
{ 
    A< std::array<int,10>, double> a; 
    a.a +=3; 
} 

daha basit uzmanlık başka güzel bir örneğidir: @dys gibi

template<typename T, unsigned int N> 
struct A { 
    T a = N; 
}; 

template<unsigned int N> 
struct A<int, N> { 
    int a = 2*N; 
}; 

#include <iostream> 
using namespace std; 

main() { 
    A<float, 30> af; 
    A<int, 30> ai; 
    cout << af.a << endl << ai.a << endl; 
} 

kullanarak yorumum say'nın bu tanımlayan sorun bu şekilde de şablonlarıyerine unsigned int çalışır:

template< typename T1, typename T2 , typename T3 = int> 
struct A; 

template<typename T, std::size_t N, typename T2, typename T3> 
struct A< std::array<T,N>, T2, T3 > { 
     T3 a = N; 
     int b; 
}; 

int main() 
{ 
     A< std::array<int,10>, double> a; 
     a.a +=3; 

     A< std::array<int,10>, double, int> b; 
     b.b +=3; 
} 
+0

cevap düşünmek thats fark etmedi Asnwer @ dyp'nin yorumu olmalı. Sorun, ilk eşleştirmeyle eşleşmesidir (eksik olan evet), çünkü şablon eşleşmesi, kullanılan türler hakkında açık bir şekilde pedantiktir -> '' template std :: array'' – Gabriel

+0

@dyp gerçekten doğru, 'std :: size_t' yerine' imzasız int' çalışır. –

İlgili konular