template<class T> using myname = some::templatething<T>;
Sau đó, bạn có thể sử dụng myname
Trong trường hợp của bạn dính vào một template<class T,class S=X> using A = n2::A<T,S>;
trong n1
của bạn Chỉ cần viết một viên ngọc của một câu trả lời liên quan đến Symbol not found when using template defined in a library này có btw, có một chi.
Ok nó không được đánh dấu, vì vậy tôi sẽ giúp một số chi tiết!
sẽ không biên dịch
#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;
}
Tại sao? C++ 's 'quy tắc khai đầu tiên'
Dưới đây là đầu ra của trình biên dịch:
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
rồi nó rên rỉ về biến không sử dụng, đủ công bằng, nhưng nhận thấy nó tham chiếu đến dòng 13, đó là bởi vì nó được sử dụng định nghĩa đầu tiên đối số mẫu mặc định thực sự khá nguyên thủy và tôi không thể báo giá đặc điểm kỹ thuật cho bạn ngay bây giờ. https://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fdefault_args_for_templ_params.htm
có thể cung cấp một số thông tin chi tiết.
Dù sao nhận thấy rằng:
này biên dịch
#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;
}
Bởi vì B không có định nghĩa trước.
sản lượng xây dựng
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
Xem, tốt :)
Ghi với tờ khai phía trước bạn chỉ có thể sử dụng * s và & s (như họ có kích thước đã biết, kích thước cố định Infact) - oh và & & s
Vì vậy, bạn cần nhận được mặc định đó ngay lập tức!
Thực tế là có những thứ ở giữa và đó là trong một tệp khác không quan trọng đối với tiếng kêu vang. [Live example] (http://coliru.stacked-crooked.com/view?id=fd521dbdf5) – dyp
Và theo [temp.param]/10, vấn đề này không liên quan đến mẫu, vì cơ chế được xác định theo hàm đối số mặc định. [Live example] (http://coliru.stacked-crooked.com/view?id=17873283ec) – dyp
Điều này có thể phức tạp hơn một chút so với tôi nghĩ ban đầu. [dcl.fct.default]/9 thực sự nói rằng mã của bạn nên hoạt động, nhưng có [vấn đề mở] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1551) với * using-declaration * nơi sửa chữa được đề xuất đưa ra một mâu thuẫn với đoạn này và sẽ phá vỡ mã của bạn. – dyp