У меня возникли проблемы получения с использованием декларации на работу, что я считаю, должны работать:Тип псевдоним/с использованием декларации итератора в C++ 11
#include <iostream>
#include <vector>
using namespace std;
template<typename C, typename V>
vector<typename C::iterator> find_all1(C& c, V v)
{
vector<typename C::iterator> res;
for (auto p = c.begin(); p!=c.end(); ++p) {
if (*p == v)
res.push_back(p);
}
return res;
}
template<typename T>
using Iterator<T> = typename T::iterator;
template <typename C, typename V>
vector<Iterator<C>> find_all2(C& c, V v)
{
vector<Iterator<C>> res;
for (auto p = c.begin(); p != c.end(); ++p) {
if (*p == v)
res.push_back(p);
}
return res;
}
int main(int argc, const char *argv[])
{
return 0;
}
В основном это пример из книги Страуструпа, и он выиграл Компиляция. Первая часть (find_all1) делает, но версия шаблона, которая пытается использовать объявление использования, не будет.
Ведущая часть ошибки изрыгать выглядит так:
$ make
c++ -g -fPIC -std=c++0x -stdlib=libc++ -c -o iter_tests2.o iter_tests2.cpp
iter_tests2.cpp:18:7: error: no template named 'Iterator'; did you mean 'iterator'?
using Iterator<T> = typename T::iterator;
^~~~~~~~
iterator
/usr/bin/../lib/c++/v1/iterator:415:25: note: 'iterator' declared here
struct _LIBCPP_TYPE_VIS iterator
^
iter_tests2.cpp:18:15: error: partial specialization of alias templates is not permitted
using Iterator<T> = typename T::iterator;
^~~
Там больше, но я думаю, что важная часть идет о помощи декларации.
Да, что делает это, спасибо. Мне любопытно, является ли пример книгой Страуступа опечаткой или если стандарт изменился? –
@GabrielPerdue Скорее всего, это опечатка. – 0x499602D2