Tôi đã tập sau của mẫu:Templates chuyên môn
//1
template< typename T > void funcT(T arg)
{
std::cout<<"1: template< typename T > void funcT(T arg)";
}
//2
template< typename T > void funcT(T * arg)
{
std::cout<<"2: template< typename T > void funcT(T * arg)";
}
//3
template<> void funcT<int>(int arg)
{
std::cout<<"3: template<> void funcT<int>(int arg)";
}
//4
template<> void funcT< int * >(int * arg)
{
std::cout<<"4: template<> void funcT< int *>(int * arg)";
}
//...
int x1 = 10;
funcT(x1);
funcT(&x1);
Ai đó có thể vui lòng giải thích lý do tại sao funcT(x1);
gọi hàm # 3 và funcT(&x1);
gọi hàm # 2 nhưng không # 4 như mong đợi?
Tôi đã đọc bài viết này http://www.gotw.ca/publications/mill17.htm cho biết "độ phân giải quá tải bỏ qua các chuyên môn và chỉ hoạt động trên các mẫu chức năng cơ bản". Nhưng theo logic này funcT(x1);
nên gọi hàm # 1, không phải # 3. Tôi bị bối rối.
điều này dường như có liên quan: http://www.gotw.ca/publications/mill17.htm –
tôi có thể gửi cho bạn một cuốn sách thực sự tốt cho điều này: Addison Wesley - C++ Templates - Hướng dẫn đầy đủ – erick2red