2016-06-06 32 views
9

Aşağıdaki minimal örnekte gcc ve clang ve hatta Visual Studio üzerinde çalışıldığını ancak icc ile derlenmediğini keşfettim. Bunun geçerli C++ olup olmadığını belirlemeye çalışıyorum, ama sorularıma cevap veren standardın ilgili bölümlerini bulamıyorum çünkü bu birkaç farklı kavramın bir araya getirilmiş hali.Varsayılan şablon parametrelerini değişken şablon şablon parametrelerinde

struct.cpp(12): error: too few arguments for template template parameter "F" 
    F<D> h; 

      detected during instantiation of class "G<D, F> [with D=char, F=C]" at line 17 

bu geçerli C++ mı: icc (16.0.3) ile

// struct with multiple template parameters 
template<typename A, typename B = int> 
struct C 
{ 

}; 

// struct that tries to use C's default second parameter without specifying it 
template<typename D, template<typename E, typename ...> class F> 
struct G 
{ 
    F<D> h; 
}; 

int main() 
{ 
    G<char, C> i; 
} 

, derleme aşağıdaki hata veriyor?

Bana göre, C, ikinci şablon parametresi için varsayılan bir değere sahip olduğu için ile F<D> geçerli bir yapım olması gerektiği anlamına geliyor.

+0

Olası yinelenen gerekli mi şablon şablon parametresini kullanırken varsayılan parametreleri açık bir şekilde listelemek için?] (http://stackoverflow.com/q/24017466/27678) – AndyG

+0

'template class F' denediniz mi? – Yakk

+0

@Yakk: Sorunu gidermek için maalesef – ryan

cevap

4

Bunun bir gcc/clang hatası olduğuna inanıyorum. Bu, [hala açık] CWG Issue 150 ile ilgilidir. sağlanan mantığı içerir:

Default arguments are allowed for the parameters of a template template parameter, and those default arguments alone will be considered in a specialization of the template template parameter within a template definition; any default arguments for the parameters of a template template argument are ignored.

şablon şablon parametresi F herhangi bir varsayılan argümanlar yok - ve C için varsayılan argümanlar dikkate alınmaz. Bu yüzden, ICC'nin önerdiği gibi, kötü biçimli bir uzmanlaşma ile sonuçlanmalıyız. konuyla, gcc, clang hem sağlanan örneklerde

f() çağrısı verir (ne kuralı uygulamak gibi görünüyor ve her iki Mark Mitchell'in örnekte operator float() yolundan geçmesi. [ait

+0

CWG-150'ye bağlantı için teşekkürler. Burada önemli bir fark, variadic şablon parametrelerine sahip olduğumuzdan, bu durumda, 'B = int' varsayılan şablon parametresini alarak, sıfırın bir varadik şablon parametre listesine sahip olmak mümkündür. Bu gcc ve clang'ın yaptığı gibi görünüyor, ama icc değil. Ancak CWG-150'de değinilen sorun sadece değişken şablon parametresini kaldırmamız ve 'typename ...' yerine sadece 'typename' ile değiştirmemiz durumunda geçerlidir. – ryan

+0

@ryan Peki, bu sorun çok fazla C++ 11'i öneriyor, bu yüzden variadic şablonlara başvurmayacaktır. Ama sonuçta aynı konsept. – Barry

+0

Üzgün: Şablon şablonu arg varsayılanlarını neden ilk uygulayamadıklarını, sonra da kaynak şablonunun varsayılan hatalarını düşünebiliyor musunuz? – Yakk