Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ 11, Compile error  
:(
    Опции темы
sergioK1
Дата 3.7.2014, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Код

#include <string>
#include <vector>
using namespace std;

class AddressBook
{
    public:
    // using a template allows us to ignore the differences between functors, function pointers
    // and lambda
    template<typename Func>
    std::vector<std::string> findMatchingAddresses (Func func)
    {
        std::vector<std::string> results;
        for ( auto itr = _addresses.begin(), end = _addresses.end(); itr != end; ++itr )
        {
            // call the function passed into findMatchingAddresses and see if it matches
            if ( func( *itr ) )
            {
                results.push_back( *itr );
            }
        }
        return results;
    }

    private:
    std::vector<std::string> _addresses;
};

int main(){

     AddressBook global_address_book;

vector<string> findAddressesFromOrgs()
    {
        return global_address_book.findMatchingAddresses(
            // we're declaring a lambda here; the [] signals the start
            [] (const string& addr) { return addr.find( ".org" ) != string::npos; }
        );
    }
}




компилирую g++ -std=c++11 main.cpp
получаю D:\C++\Test\main.cpp|34|error: a function-definition is not allowed here before '{' token|

взято с гугла, что не хватает? 
PM MAIL   Вверх
NoviceF
Дата 3.7.2014, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Цитата(sergioK1 @  3.7.2014,  17:15 Найти цитируемый пост)
взято с гугла, что не хватает?  


Что-то я не припомню, чтобы обычную функцию можно было объявлять в теле main, мне такое ниразу не встречалось. Но я не знаток smile
PM MAIL   Вверх
sergioK1
Дата 3.7.2014, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(NoviceF @ 3.7.2014,  16:11)
Цитата(sergioK1 @  3.7.2014,  17:15 Найти цитируемый пост)
взято с гугла, что не хватает?  


Что-то я не припомню, чтобы обычную функцию можно было объявлять в теле main, мне такое ниразу не встречалось. Но я не знаток smile

Вот я и не понимаю http://www.cprogramming.com/c++11/c++11-lambda-closures.html
приводятся  ошибочные примеры? или как? 
PM MAIL   Вверх
volatile
Дата 3.7.2014, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  3.7.2014,  17:29 Найти цитируемый пост)
Вот я и не понимаю http://www.cprogramming.com/c++11/c++11-lambda-closures.html
приводятся  ошибочные примеры? или как?  


Где вы там увидели определение функции в теле другой функции?

PM MAIL   Вверх
sergioK1
Дата 3.7.2014, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 3.7.2014,  18:55)
Цитата(sergioK1 @  3.7.2014,  17:29 Найти цитируемый пост)
Вот я и не понимаю http://www.cprogramming.com/c++11/c++11-lambda-closures.html
приводятся  ошибочные примеры? или как?  


Где вы там увидели определение функции в теле другой функции?

Это  NoviceF увидел Я же вижу что примеры не компилируються, 
флаг на С++11 я ставлю в чем причина? 
PM MAIL   Вверх
sQu1rr
Дата 3.7.2014, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(sergioK1 @  3.7.2014,  21:57 Найти цитируемый пост)
Это  NoviceF увидел 

Все правильно он увидел smile
Вы вставили отрывок кода в мейн, который предпологается быть в глобальном пространстве...
PM MAIL Skype GTalk   Вверх
volatile
Дата 3.7.2014, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  3.7.2014,  21:57 Найти цитируемый пост)
Это  NoviceF увидел Я же вижу что примеры не компилируються,  

В вашем коде определение функции вставлено в тело другой функции.

Добавлено @ 22:17
sQu1rr, правильно сказал.

Это сообщение отредактировал(а) volatile - 3.7.2014, 22:19
PM MAIL   Вверх
Lukkoye
Дата 3.7.2014, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(sergioK1 @  3.7.2014,  21:57 Найти цитируемый пост)
Это  NoviceF увидел Я же вижу что примеры не компилируються, 
флаг на С++11 я ставлю в чем причина?  


Выдержка вашего кода не является примером из указанной ссылки.
Вы не правильно поняли материал. И не правильно его воспроизвели.


Ваш код содержит синтаксическую ошибку: нельзя создавать локальные функцию внутри другой функции.


PM MAIL   Вверх
sergioK1
Дата 4.7.2014, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(sQu1rr @ 3.7.2014,  21:04)
Цитата(sergioK1 @  3.7.2014,  21:57 Найти цитируемый пост)
Это  NoviceF увидел 

Все правильно он увидел smile
Вы вставили отрывок кода в мейн, который предпологается быть в глобальном пространстве...

OK , понял, автор не приводит цельный код, что сильно осложняет понимание,  

Что то мне такой стиль написания кажеться сильно перекрученным,  зачем там 
шаблон, когда ясно оно только для стрингов?
и что мешает   написать отдельную функцию для проверки и сделать ее виртуальной 
для возможной перегрузки в будущем, или по сишному через указатель,

Сама по себя лямда вещь красивая, но чреватая трудностями в отладке,
Или я чего не вижу? 
  
PM MAIL   Вверх
volatile
Дата 4.7.2014, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  4.7.2014,  12:24 Найти цитируемый пост)
зачем там шаблон, когда ясно оно только для стрингов?

Там же есть ответ на ваш вопрос
Цитата
// using a template allows us to ignore the differences between functors, function pointers 
// and lambda


Цитата(sergioK1 @  4.7.2014,  12:24 Найти цитируемый пост)
и что мешает   написать отдельную функцию для 

с лямбдой удобней. Код появляется там где нужно, без определения дополнительных функций, неизвестно где расположенных.
(которым еще и названия придумывать надо,   smile )

Цитата(sergioK1 @  4.7.2014,  12:24 Найти цитируемый пост)
Сама по себя лямда вещь красивая, но чреватая трудностями в отладке,

лямбда не только  (и даже не столько) красивая, сколько удобная.
А трудности при отладке - вещь субъективная.
С опытом трудностей будет меньше.

PM MAIL   Вверх
sergioK1
Дата 4.7.2014, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 4.7.2014,  15:18)
Цитата(sergioK1 @  4.7.2014,  12:24 Найти цитируемый пост)
зачем там шаблон, когда ясно оно только для стрингов?

Там же есть ответ на ваш вопрос
Цитата
// using a template allows us to ignore the differences between functors, function pointers 
// and lambda


вот такой записи я не понимаю,

Код


 template<typename Func>
    std::vector<std::string> findMatchingAddresses (Func func)


что такая функция принимает? поинтер на другую функцию 
которая принимает что?  и что возвращает? 



PM MAIL   Вверх
volatile
Дата 4.7.2014, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  4.7.2014,  18:14 Найти цитируемый пост)
вот такой записи я не понимаю,
 template<typename Func>
std::vector<std::string> findMatchingAddresses (Func func)

Вы привели слишком маленький отрывок, чтобы что-то сказать
Это шаблон. и если судить только по этому отрывку, не зная ничего более, то
здесь Func = это произвольнй тип, не обязательно функция. несмотря на название  smile 

Если взять отрывок побольше
Код

   template<typename Func>
    std::vector<std::string> findMatchingAddresses (Func func)
    { 
        std::vector<std::string> results;
        for ( auto itr = _addresses.begin(), end = _addresses.end(); itr != end; ++itr )
        {
            // call the function passed into findMatchingAddresses and see if it matches
            if ( func( *itr ) )
            {
                results.push_back( *itr );
            }
        }
        return results;
    }


то Func - это любой тип имеющий operator(std::string) возвращающий что либо, приводящееся к bool

короче любой тип, при записи которого, строчка
Код

            if ( func( *itr ) )

не вызовет синтаксич. ошибок
например функция:
Код

bool funcname (const std::string &);
указатель на такую функцию, лямбда сооветствующая, и т.д.

Или например 
Код

void* funcname (std::string);

тоже формаьно подойдет, ну и т.д.

Или например произольный тип, скажем такой:
Код

struct some
{
   int operator()(const std::string & s)
   {
      return s.empty();
   }
};

тоже не вызовет синт. ошибок.

Я специально не показывал лямбды (они есть в статье)
поскольку у вас проблемы с пониманием того, что существуют в языке уже давно, и к нововведеням С++11 не имеет отношения.


Это сообщение отредактировал(а) volatile - 4.7.2014, 20:24
PM MAIL   Вверх
baldina
Дата 4.7.2014, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(sergioK1 @  4.7.2014,  18:14 Найти цитируемый пост)
что такая функция принимает? поинтер на другую функцию 
которая принимает что?  и что возвращает? 

что угодно, выглядящее как функция; то, с чем можно обходиться так
Код

func( *itr )

это может быть функция, лямбда-функция или функциональный объект, т.е. имеющий operator()()

вообще findMatchingAddresses это не функция, а шаблон функции (template). функцию создаст компилятор, когда встретит вызов. по вызову будет понятно, с каким конкретным типом параметра создавать.

Добавлено через 1 минуту и 16 секунд
уже volatile ответил) 
PM MAIL   Вверх
sergioK1
Дата 5.7.2014, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 4.7.2014,  19:18)
Я специально не показывал лямбды (они есть в статье)
поскольку у вас проблемы с пониманием того, что существуют в языке уже давно, и к нововведеням С++11 не имеет отношения.

Да для меня С++ это new вместо mallос, cout вместо prinf и классы вместо структур,
вектор вместо realloc,шаблоны вместо макро, хотя макро нужны там где они нужны , 
друзья , операторы и простые шаблоны, т,е уровень где-то 2002года , 
Это только одна часть 
Посоветуйте где взять "другую" туториал для начинающих мне не годиться,
нужно что-то посерьезней (лямды потом сами станут понятны), стандарт для меня 
пока сложноват, програмировать я умею мне нужно имеено язык с нюансами,
и пониманием сути имеено как С++ а не "как жава без GC и доступом к памяти" 
В гугле полно мусора  smile 
PM MAIL   Вверх
baldina
Дата 5.7.2014, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



sergioK1, вы пихаете функцию в функцию и удивляетесь. думаю все-же нужен туториал для начинающих. возьмите любую толстую книжку - страуструп, лафоре, прата

для понимания функционального стиля и шаблонов подойдет эта книга по bgl.
и вообще серия "C++ in Depth"
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.