2014-01-20 2 views
1

У меня возникли проблемы получения с использованием декларации на работу, что я считаю, должны работать:Тип псевдоним/с использованием декларации итератора в 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; 
       ^~~ 

Там больше, но я думаю, что важная часть идет о помощи декларации.

ответ

4

Ваш синтаксис неверен, удалите <T>:

template<typename T> 
using Iterator = typename T::iterator; 
+0

Да, что делает это, спасибо. Мне любопытно, является ли пример книгой Страуступа опечаткой или если стандарт изменился? –

+1

@GabrielPerdue Скорее всего, это опечатка. – 0x499602D2

 Смежные вопросы

  • Нет связанных вопросов^_^