Tôi đã kêu lách cách để xác nhận ví dụ trên trang 91 của Hiệu quả hiện đại C++, và tôi gặp phải vấn đề có vẻ lạ. Đây đangC++ tuyên bố không chấp nhận thay đổi khoản khấu trừ mẫu
template<typename C>
void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
std::cout << "container version" << std::endl;
}
template<>
void doStuff<int>(int& x, int& y) noexcept {
std::cout << "int version" << std::endl;
}
int main() {
vector<int> v1 = {1, 2, 3};
vector<int> v2 = {4, 5, 6};
int x = 5;
int y = 6;
doStuff(x, y);
doStuff(v1, v2);
}
Cung cấp cho tôi một lỗi như
error: request for member ‘front’ in ‘a’, which is of non-class type ‘int’ void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
Vì vậy, nó có vẻ như phiên bản đầu doStuff đang được gọi là, mặc dù a.front() và b.front() nên trả về các tham chiếu đến ints. Nếu tôi loại bỏ tất cả các khai báo không nhận biết từ mã, tôi nhận được kết quả mong đợi.
Điều này là với gcc 5.4.
Tôi đang làm gì sai?
Cảm ơn
Hãy nhớ rằng các mẫu là một tính năng biên dịch. Khi phiên bản đầu tiên của hàm 'doStuff' được định nghĩa, trình biên dịch không biết gì về chuyên môn cho' int'. –
Ngoài ra còn có vấn đề 'doStuff' chưa được khai báo khi nó được sử dụng lần đầu trong đặc tả' noexcept'. – aschepler