template<class T> using myname = some::templatething<T>;
Quindi è possibile utilizzare mionome
Nel tuo caso attaccare un template<class T,class S=X> using A = n2::A<T,S>;
nella vostra n1
appena scritto una gemma di una risposta relativa a questo Symbol not found when using template defined in a library lì btw, hanno un letto.
Ok, non è stato spuntato, quindi ho intenzione di aiutare un po 'di più!
non verrà compilato
#include <iostream>
namespace n1 {
namespace n2 {
template<class U,class V> struct A;
}
template<class U,class V> using A = n2::A<U,V>;
}
static n1::A<int,int>* test;
struct X {};
namespace n1 {
namespace n2 {
template<class U,class V> struct A {};
}
template<class U,class V=X> using A = n2::A<U,V>;
}
static n1::A<int> test2;
int main(int,char**) {
return 0;
}
Perché? 'Prima regola dichiarazione' C++ s '
Ecco l'output del compilatore:
make all
if ! g++ -Isrc -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings -MM src/main.cpp >> build/main.o.d ; then rm build/main.o.d ; exit 1 ; fi
g++ -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings -Isrc -c src/main.cpp -o build/main.o
src/main.cpp:26:17: error: wrong number of template arguments (1, should be 2)
static n1::A<int> test2;
^
src/main.cpp:13:47: error: provided for ‘template<class U, class V> using A = n1::n2::A<U, V>’
template<class U,class V> using A = n2::A<U,V>;
^
src/main.cpp:26:24: error: invalid type in declaration before ‘;’ token
static n1::A<int> test2;
^
src/main.cpp:16:24: warning: ‘test’ defined but not used [-Wunused-variable]
static n1::A<int,int>* test;
^
src/main.cpp:26:19: warning: ‘test2’ defined but not used [-Wunused-variable]
static n1::A<int> test2;
^
make: *** [build/main.o] Error
Va bene che è piagnucolare sulle variabili non utilizzate, abbastanza giusto, ma notate è indicando la linea 13, che è perché ha usato la prima definizione argomenti di template di default sono davvero abbastanza primitivi e non posso citare le specifiche in questo momento. https://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fdefault_args_for_templ_params.htm
che può offrire qualche intuizione però.
In ogni caso notare che:
Questo compila
#include <iostream>
namespace n1 {
namespace n2 {
template<class U,class V> struct A;
}
template<class U,class V> using A = n2::A<U,V>;
}
static n1::A<int,int>* test;
struct X {};
namespace n1 {
namespace n2 {
template<class U,class V> struct A {};
}
template<class U,class V=X> using B = n2::A<U,V>;
}
static n1::B<int> test2;
int main(int,char**) {
return 0;
}
Poiché B non ha una definizione preventiva.
uscita Corporatura
make all
if ! g++ -Isrc -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings -MM src/main.cpp >> build/main.o.d ; then rm build/main.o.d ; exit 1 ; fi
g++ -Wall -Wextra -O3 -std=c++11 -g -gdwarf-2 -Wno-write-strings -Isrc -c src/main.cpp -o build/main.o
src/main.cpp:16:24: warning: ‘test’ defined but not used [-Wunused-variable]
static n1::A<int,int>* test;
^
src/main.cpp:26:19: warning: ‘test2’ defined but not used [-Wunused-variable]
static n1::B<int> test2;
^
g++ build/main.o -o a.out
Sede, bene :)
ricordare con le dichiarazioni previsionali si possono utilizzare solo * s e & s (in quanto sono di dimensioni note, dimensioni infatti fisso) - oh e & & s
Quindi è necessario ottenere quel valore predefinito in là subito!
Il fatto che ci siano elementi in mezzo e che si trovano in un file diverso non ha importanza per il clang. [Esempio dal vivo] (http://coliru.stacked-crooked.com/view?id=fd521dbdf5) – dyp
E secondo [temp.param]/10, questo problema non è correlato ai modelli, poiché il meccanismo è definito in termini di argomenti di default della funzione. [Esempio dal vivo] (http://coliru.stacked-crooked.com/view?id=17873283ec) – dyp
Questo potrebbe essere un po 'più complicato di quanto pensassi in origine. [dcl.fct.default]/9 in realtà dice che il tuo codice dovrebbe funzionare, ma c'è un [problema aperto] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1551) con * using-declaration * dove la correzione proposta introduce una contraddizione in questo paragrafo e potrebbe infrangere il codice. – dyp