2013-08-08 22 views
14

Với hai hàm sau đây, tôi mong đợi quá tải đầu tiên sẽ được gọi nếu tôi vượt qua nó std::pair<const char*, std::size_t>, vì nó cụ thể hơn so với T chung.Quá tải cụ thể không được gọi là

void foo(const std::pair<const char*, std::size_t>& p) 
{ 
    std::cout << "pair" << std::endl; 
} 

template <class T> 
void foo(const T& v) 
{ 
    std::cout << "generic" << std::endl; 
} 

int main() 
{ 
    const char* s = "abc"; 
    foo(std::make_pair(s, std::size_t(3))); 
} 

Tuy nhiên, chương trình này kết quả đầu ra:

generic 

Tại sao tình trạng quá tải thứ hai gọi là, thay vì quá tải mà phải mất một cách rõ ràng pair?

Đây có phải là vấn đề về trình biên dịch không? Tôi tình cờ sử dụng một trình biên dịch khá cũ (GCC 4.1.2) vào lúc này.

Hmm ... nó có thể là một vấn đề biên dịch:

http://ideone.com/97XwwZ

+0

trình ở đây: http://ideone.com/vV55Ea Hoạt động trên VS2010 cũng có. – Chad

+0

Không thể tái tạo bằng g ++ (GCC) 4.7.2 – NPE

+0

Làm việc như bạn mong đợi trong VS2012, cho những gì nó có giá trị. –

Trả lời

9

trình biên dịch của bạn chắc chắn là do lỗi. Lỗi là gì, sẽ chỉ là suy đoán, nhưng bạn chính xác rằng mã này sẽ cung cấp cho đầu ra cụ thể hơn. Mẫu không đủ lớn hoặc phức tạp đối với bất kỳ quy tắc tinh tế nào hơn là nguyên nhân.

0

Theo quá tải độ phân giải, nó nên thích một cụ thể trong ví dụ của bạn.

Tôi có thể nói rằng đây là lỗi trình biên dịch do phiên bản cũ hơn. Khi được biên dịch bằng GCC 4.8.1. Nó ra

pair 

theo liên kết này: overloading resolution demo

4

Dường như đây chỉ là vấn đề về trình biên dịch. Tôi đã sử dụng một trình biên dịch cũ (GCC 4.1.2). Sử dụng một trình biên dịch ít cổ dường như dẫn đến sự quá tải đúng được gọi

http://ideone.com/97XwwZ

#include <iostream> 
#include <utility> 

void foo(const std::pair<const char*, std::size_t>& p) 
{ 
    std::cout << "pair" << std::endl; 
} 

template <class T> 
void foo(const T& v) 
{ 
    std::cout << "generic" << std::endl; 
} 

int main() 
{ 
    const char* s = "abc"; 
    foo(std::make_pair(s, std::size_t(3))); 
} 
Các vấn đề liên quan