Tôi đang cố gắng sử dụng khấu trừ đối số mẫu với thừa kế và std::shared_ptr
. Như bạn có thể thấy trong mã mẫu bên dưới, tôi đang chuyển một hàm shared_ptr<Derived>
đến một hàm không phải là thành viên có khuôn mẫu, nên thực hiện khấu trừ đối số mẫu. Nếu tôi đặt tên theo cách thủ công thì mọi thứ sẽ hoạt động, và nếu tôi để cho nó thực hiện việc trích đối số mẫu thì nó không. Nó sẽ dường như như thể trình biên dịch không thể tìm ra loại, tuy nhiên thông báo lỗi cho thấy rằng nó đã làm. Tôi không chắc những gì đang xảy ra ở đây, và tôi sẽ đánh giá cao bất kỳ đầu vào nào. (Visual Studio 2010)Vấn đề với std :: shared_ptr, thừa kế, và khấu trừ đối số mẫu
#include <memory>
template <typename T>
class Base {};
class Derived : public Base<int> {};
template <typename T>
void func(std::shared_ptr<Base<T> > ptr) {};
int main(int argc, char* argv[])
{
std::shared_ptr<Base<int>> myfoo(std::shared_ptr<Derived>(new Derived)); // Compiles
func(myfoo); // Compiles
func<int>(std::shared_ptr<Derived>(new Derived)); // Compiles
func(std::shared_ptr<Derived>(new Derived)); // Doesn't compile. The error message suggests it did deduce the template argument.
return 0;
}
Các thông báo lỗi:
5> error C2664: 'func' : cannot convert parameter 1 from 'std::tr1::shared_ptr<_Ty>' to 'std::tr1::shared_ptr<_Ty>'
5> with
5> [
5> _Ty=Derived
5> ]
5> and
5> [
5> _Ty=Base<int>
5> ]
5> Binding to reference
5> followed by
5> Call to constructor 'std::tr1::shared_ptr<_Ty>::shared_ptr<Derived>(std::tr1::shared_ptr<Derived> &&,void **)'
5> with
5> [
5> _Ty=Base<int>
5> ]
5> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory(1532) : see declaration of 'std::tr1::shared_ptr<_Ty>::shared_ptr'
5> with
5> [
5> _Ty=Base<int>
5> ]
5>
Dưới đây là những gì GCC 4.7.3 phải nói về nó, FYI: 't.cpp: 9: 6: lưu ý: đối số/thay thế đối số mẫu không thành công: t.cpp: 16: 47: lưu ý: các loại không khớp Cơ sở 'và' Có nguồn gốc ' t.cpp: 16: 47: lưu ý:' std :: shared_ptr 'không bắt nguồn từ' std :: shared_ptr > '' –