Tôi đang cố viết hàm để thể hiện các thùng chứa STL chung (vectơ, danh sách, v.v.). Tôi đã cho hàm một tham số mẫu T, ví dụ, có thể đại diện cho vectơ. Tôi đang gặp vấn đề nhận được một iterator kiểu T.Lỗi với T :: iterator, trong đó tham số mẫu T có thể là vector <int> hoặc danh sách <int>
vector<int> v(10, 0);
repr< vector<int> >(v);
...
template <typename T>
void repr(const T & v)
{
cout << "[";
if (!v.empty())
{
cout << ' ';
T::iterator i;
for (i = v.begin();
i != v.end()-1;
++i)
{
cout << *i << ", ";
}
cout << *(++i) << ' ';
}
cout << "]\n";
}
...
[email protected]:~/Desktop/stl$ g++ -Wall main.cpp
main.cpp: In function ‘void repr(const T&)’:
main.cpp:13: error: expected ‘;’ before ‘i’
main.cpp:14: error: ‘i’ was not declared in this scope
main.cpp: In function ‘void repr(const T&) [with T = std::vector<int, std::allocator<int> >]’:
main.cpp:33: instantiated from here
main.cpp:13: error: dependent-name ‘T::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:13: note: say ‘typename T::iterator’ if a type is meant
tôi đã cố gắng 'typename T :: iterator' là trình biên dịch đề xuất, nhưng chỉ có một lỗi khó hiểu hơn.
Chỉnh sửa: Cảm ơn các bạn đã trợ giúp! Dưới đây là một phiên bản làm việc cho bất cứ ai muốn sử dụng chức năng này:
template <typename T>
void repr(const T & v)
{
cout << "[";
if (!v.empty())
{
cout << ' ';
typename T::const_iterator i;
for (i = v.begin();
i != v.end();
++i)
{
if (i != v.begin())
{
cout << ", ";
}
cout << *i;
}
cout << ' ';
}
cout << "]\n";
}
Làm cách nào để đăng thông báo lỗi "khó hiểu hơn"? –
btw, bạn có thể muốn thay thế v.end() - 1 bằng một cái gì đó khác mà các bộ lặp không hỗ trợ RandomAccess cũng hỗ trợ. – sellibitze