2013-01-14 42 views
18

Tôi đang gặp rắc rối với các mã sau và dường như không thể tìm ra những gì là saiSử dụng các vector trong C++

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

double distance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    cout<<distance(age[0],age[1]); 
    return 0; 
} 

Lỗi nằm ở gọi về khoảng cách hoạt động.

/usr/include/c++/4.6/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits<int>’: 
test.cpp:18:30: instantiated from here 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:166:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:167:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:168:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:169:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:170:53: error: ‘int’ is not a class, struct, or union type 
+0

gì bạn muốn làm gì? –

+0

Tôi muốn lưu trữ dữ liệu trong một mảng vectơ (đối với kích thước động), sau đó tính khoảng cách giữa các điểm dữ liệu. –

Trả lời

33

Bạn đang cố gắng để ghi đè lên chức năng std :: khoảng cách, hãy thử gỡ bỏ "using namespace std" và đủ điều kiện coutendl với std::

#include <iostream> 
#include <cmath> 
#include <vector> 


double distance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    std::vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    std::cout<< distance(age[0],age[1]); 
    return 0; 
} 

Các std::distance là được sử dụng để đếm số phần tử trong vùng chứa trong phạm vi được chỉ định. Bạn có thể tìm hiểu thêm về nó here.

Hoặc bạn có thể đổi tên chức năng khoảng cách của bạn nếu bạn muốn giới thiệu std:: namespace:

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

double mydistance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    cout<<mydistance(age[0],age[1]); 
    return 0; 
} 

Điều này sẽ làm cho công việc mã của bạn, nhưng nó không được khuyến khích để có "using namespace" tờ khai trước khi định nghĩa. Khi bạn viết mã của mình, bạn nên tránh tùy chọn thứ hai, nó được hiển thị ở đây chỉ như là một thay thế cho ví dụ mã của bạn.

+2

Hoặc đơn giản là đổi tên chức năng khoảng cách của chính bạn và loại bỏ xung đột bằng' std :: distance'. – Mithrandir

+1

@Mithrandir Đó là một sửa chữa nhanh chóng và rẻ tiền. Tôi thích áp phích trả lời. – Caesar

+6

@Mithrandir, không, "đơn giản" là "không mang một không gian tên khác vào không gian tên chung", bởi vì * đó là lý do tại sao chúng tôi có chúng *! – Griwes

4

Không sử dụng using namespace std khi bạn đang tạo chức năng của riêng bạn gọi distance, bởi vì cuộc gọi của bạn để distance đang tìm kiếm std::distance và không hoạt động distance của bạn.

Bạn cũng có thể làm điều này:

namespace foo 
{ 
    double distance(int a, int b) 
    { 
    return fabs(a-b); 
    } 
} 

int main() 
{ 
    foo::distance(x,y); //now you're calling your own distance function. 
} 
+0

Có vẻ như anh ta có cách thực hiện 'khoảng cách 'riêng của mình – CAMOBAP

9

Làm thế nào về

cout<< ::distance(age[0],age[1]); 

(câu trả lời khác đã đề nghị loại bỏ các chỉ thị using).

+3

Đây là một điều đáng giá để biết về toán tử phân giải phạm vi, nhưng tôi sẽ không đặt nó trong mã sản xuất trừ khi tránh nó sẽ gây ra những vấn đề lớn, lớn. Không có ít +1 cho đố hữu ích. – dmckee

0

Ngoài ra, bạn có thể sử dụng

using foo::distance; // OR: 
using namespace foo; 

(distance)(x,y); // the (parens) prevent ADL 
Các vấn đề liên quan