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:
trình ở đây: http://ideone.com/vV55Ea Hoạt động trên VS2010 cũng có. – Chad
Không thể tái tạo bằng g ++ (GCC) 4.7.2 – NPE
Làm việc như bạn mong đợi trong VS2012, cho những gì nó có giá trị. –