Một mẫu không thể là một constructor sao chép. §12.8/2, chú thích:
Because a template constructor is never a copy constructor, the presence of such a template does not suppress the implicit declaration of a copy constructor. Template constructors participate in overload resolution with other constructors, including copy constructors, and a template constructor may be used to copy an object if it provides a better match than other constructors.
Kể từ khi lập luận của mẫu của bạn là const &
, chữ ký của nó sẽ được chính xác giống như chức năng ngầm-tuyên bố trong trường hợp sao chép, vì vậy nó sẽ không bao giờ được sử dụng như một constructor sao chép.
Điều đó có thể được chấp nhận, bởi vì trong ví dụ bạn đang sử dụng nó làm công cụ xây dựng chuyển đổi. Tuy nhiên, đối số mẫu trước ::
là ngữ cảnh không được suy luận, do đó trình biên dịch không thể cắm vào số A<int>::B
và giải quyết int
. Bởi vì các cách khác nhau của các mẫu chuyên biệt, không có cách nào cho trình biên dịch để tìm ra A
, nếu có, đủ điều kiện. Bạn có thể thêm typedef A<int>::B B;
bên trong A<float>
và sau đó cả int
và float
sẽ đủ điều kiện là U
.
Bạn có thể sửa lỗi này bằng cách sử dụng SFINAE và thêm các loại thành viên vào các lớp để giúp điều hướng phân cấp. Đây là một demo.
#include <typeinfo>
#include <iostream>
template<typename T>
struct A
{
typedef T type;
struct B
{
B() {}
template<typename U>
B(const U& rhs, typename U::nest_A_parent * = NULL) {
std::cout << "copied from type "
<< typeid(typename U::nest_A_parent::type).name() << '\n';
}
private:
typedef A nest_A_parent;
template< typename U >
friend struct B;
};
};
int main()
{
A<int>::B x;
A<double>::B y(x);
}
Để làm rõ, chuyển đổi mong muốn là gì? Bởi vì bạn không chuyển đổi int thành double, nhưng là A :: B thành A :: B, là một lớp đến lớp khác. –
SSight3
@ SSight3: hãy để tôi đoán Robert đang cố gắng thực hiện lại các con trỏ thông minh với các số liệu bên ngoài và các phép gán đa hình ... – sehe
Chuyển đổi từ A :: B thành A :: B cho mọi T, U. int và double chỉ là những ví dụ tôi đã sử dụng. Và không, sehe, đó không phải là những gì tôi đang làm. –