2016-06-06 20 views
9

Ho scoperto che l'esempio di seguito riportato funziona su gcc e clang e anche su Visual Studio ma non viene compilato con icc. Sto cercando di determinare se questo è C++ valido, ma non sono in grado di trovare le parti rilevanti dello standard che rispondono alla mia domanda poiché si tratta di diversi concetti combinati.Utilizzo dei parametri del modello predefinito nei parametri del modello di template variad

// 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; 
} 

con ICC (16.0.3), la compilazione dà il seguente errore:

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 

È questo valido C++?

Per me sembra che dovrebbe essere, perché C ha un valore predefinito per il suo secondo parametro modello, il che significa che F<D> con F = C deve essere una costruzione valida.

+0

Possibile duplicato [E 'necessario elencare esplicitamente i parametri predefiniti quando si utilizza il parametro template template?] (http://stackoverflow.com/q/24017466/27678) – AndyG

+0

Hai provato 'template class F?? – Yakk

+0

@Yakk: che non correggi il problema, purtroppo – ryan

risposta

4

Credo che questo sia un bug di gcc/clang. Questo è legato allo [ancora aperto] CWG Issue 150. La logica fornito comprende:

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.

Il modello parametro di template F non ha argomenti di default - e gli argomenti di default per C vengono ignorati. Quindi dovremmo finire con una specializzazione mal formata, come suggerisce ICC.

Negli esempi forniti nel numero, sia gcc e clang sembrano implementare la regola (non permette la chiamata a f() e sia passare attraverso il percorso operator float() nell'esempio di Mark Mitchell.

+0

Grazie per il collegamento a CWG-150. Una differenza importante qui è che abbiamo parametri di modelli variadici, quindi in questa situazione è possibile avere un elenco di parametri modello variabile della lunghezza zero prendendo il parametro di default del modello di 'B = int'. Questo è ciò che sembrano fare gcc e clang, ma non icc. Ma il problema cui si fa riferimento in CWG-150 si applica solo se dovessimo rimuovere la lista dei parametri del modello variadic e sostituirla con solo 'typename' invece di' typename ... '. – ryan

+0

@ryan Bene, questo problema precede C++ 11 di molto, quindi non si riferirà ai modelli variadic. Ma alla fine è lo stesso concetto. – Barry

+0

Triste: puoi pensare a una giustificazione del perché non sono stati in grado di applicare per la prima volta i valori predefiniti dello schema modello di template, quindi gli argomenti predefiniti del modello di origine? – Yakk

Problemi correlati