2015-08-19 14 views
5

Ho modificato un paremeter in una funzione per accettare qualsiasi tipo di oggetto utilizzando un modello ma non posso usarlo in combinazione con altri parametri predefiniti, c'è qualcosa che mi manca?Perché non posso avere template e argomenti predefiniti?

#include <string> 
#include <iostream> 

class MyClass { 
    public: 
    std::wstring msg = L"hey"; 
    MyClass(){}; 
}; 

class MyClass2{ 
    public: 
    template<class T> MyClass2(T* t, int i); 
}; 
template<class T> 
MyClass2::MyClass2(T* t,int i=0){ std::wcout << t->msg << std::endl; } 

int main(int argc, char **argv) 
{ 
    MyClass mc; 
    MyClass2 mc2(&mc); 
    return 0; 
} 

uscita:

practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive] 

ho pensato che era ragionevole di non utilizzare i valori di default nel modello, ma c'è un motivo per gli altri parametri?

risposta

17

Sicuramente can; metti l'argomento predefinito sulla dichiarazione, non la definizione.

Mettere il default nella lista degli argomenti della definizione di posto della dichiarazione di è un extra aggiunto che non è disponibile per i modelli di funzione:

[C++14: 8.3.6/4]: Per le funzioni non-modello, gli argomenti di default possono essere aggiunti nelle dichiarazioni successive di una funzione nello stesso ambito. [..]

Io in realtà non so perché questa restrizione è a posto.

regola simile:

[C++14: 8.3.6/6]: Fatta eccezione per le funzioni di membro di modelli di classe, gli argomenti di default in una definizione di funzione membro che appare al di fuori della definizione di classe si aggiungono alla serie di argomenti di default fornita dalla funzione membro dichiarazione nella definizione della classe [..]

Problemi correlati