Модераторы: 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   Вверх
sergioK1
Дата 5.7.2014, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(baldina @ 5.7.2014,  16:12)
sergioK1, вы пихаете функцию в функцию и удивляетесь. 

Это не я пихаю, а автор того примера, у Страуструпа я таких примеров не вижу,   
книга на 1100 страниц ,
что вообще дает такой стиль? это же нарушении ООP? Это чтоб специально показать работу лямды ? 
Когда параметр поинтер на функцию я еще понимаю, а лучше virtual protected 
или вообще pure virtual, я так делаю уже лет 10, не важно на каком языке,

Как  разьясняеться  нормальный С++ vs  то о чем известная фраза Линуса,




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


Шустрый
*


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

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



Цитата(sergioK1 @  5.7.2014,  18:50 Найти цитируемый пост)
Это не я пихаю, а автор того примера, 


Ложь.

По указанной ссылке нет таких примеров.




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


Эксперт
****


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

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



sergioK1, вы пример не поняли, его автор не виноват. ваш код - не код примера.

Цитата(sergioK1 @  5.7.2014,  18:50 Найти цитируемый пост)
о чем известная фраза Линуса

оставим это на его совести
впрочем с++ вам никто не навязывает...

Цитата(sergioK1 @  5.7.2014,  18:50 Найти цитируемый пост)
нарушении ООP

в чем же? это к ооп вообще не относится. кстати не оопом единым, с++ мультипарадигмный язык

PM MAIL   Вверх
sergioK1
Дата 5.7.2014, 22:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(baldina @ 5.7.2014,  21:14)
sergioK1, вы пример не поняли, его автор не виноват. ваш код - не код примера.

Цитата(sergioK1 @  5.7.2014,  18:50 Найти цитируемый пост)
о чем известная фраза Линуса

оставим это на его совести
впрочем с++ вам никто не навязывает...

Цитата(sergioK1 @  5.7.2014,  18:50 Найти цитируемый пост)
нарушении ООP

в чем же? это к ооп вообще не относится. кстати не оопом единым, с++ мультипарадигмный язык

В чем разница? Автор не приводит main функцию? 
 http://www.cprogramming.com/c++11/c++11-lambda-closures.html
это не автор написал шаблон?  Я так не пишу нигде, хотя многие языки позволяют,

Добавлено через 13 минут и 30 секунд
Цитата(baldina @ 5.7.2014,  21:14)
в чем же? это к ооп вообще не относится. кстати не оопом единым, с++ мультипарадигмный язык

Я знаю две парадигмы is a и has a,  до компиляции(шаблоны) и после,
говорить можно много и не о чем но суть та же, 
Тот же Линус прекрасно пишет  в стиле ООP,   только не признает что это некая парадигма, 

PM MAIL   Вверх
baldina
Дата 5.7.2014, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


Опытный
**


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

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



Цитата(baldina @ 5.7.2014,  21:54)
автор не помещал функцию в функцию, его код корректен. да и никто вам ничего не навязывает. вы чего хотите то? понять и научиться или утвердиться что разные дураки пишут глупые статьи про использование ненужных фич с++?

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

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


Шустрый
*


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

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



Цитата(sergioK1 @  5.7.2014,  23:03 Найти цитируемый пост)
Он не привел целого, работающего примера, который  можно запустить и пройтись в дебаге, это меня сбило с толку, 


Имхо, у этого автора низкое качество статей. Я бы не стал тратить на них своё время.
Он, как и многие другие программисты допускает две классические ошибки:

1. Покажите как это используется. А потом объясните как это устроенно внутри. 
Вместо этого, автор перемешивает дизайн использования и реализацию, показывая и то и другое урывками.

Получается шляпа. А все что нужно было - это рабочий main с комментариями.

2. Объясняют сабж, забывая о том, что собеседник не в теме. В итоге, правильно понять их могут только те люди, которые итак уже в теме. Но те, что в теме - им такие стать уже и не нужны, они итак материал знают.

Итого: новички не осиливают ни использование, ни идею по таким унылым статьям.
А для "бывалых морских волков" эти статьи не нужны.


Цитата(sergioK1 @  5.7.2014,  23:03 Найти цитируемый пост)

С++ он позволяет писать как угодно,  в том числе и через одно место, 
я хочу понять как писать нормально  как нет,  где шаблоны нужны а где 
оверхед, есть такие нидь статьи толковые на эту тему? 


По поводу шаблонов, почитайте Александресску, и Джоссатиса.
По поводу лямбд лучше почитать самого Страуструпа.




Это сообщение отредактировал(а) Lukkoye - 6.7.2014, 12:51
PM MAIL   Вверх
sergioK1
Дата 6.7.2014, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lukkoye @ 6.7.2014,  11:50)
Итого: новички не осиливают ни использование, ни идею по таким унылым статьям.
А для "бывалых морских волков" эти статьи не нужны.


Цитата(sergioK1 @  5.7.2014,  23:03 Найти цитируемый пост)

С++ он позволяет писать как угодно,  в том числе и через одно место, 
я хочу понять как писать нормально  как нет,  где шаблоны нужны а где 
оверхед, есть такие нидь статьи толковые на эту тему? 


По поводу шаблонов, почитайте Александресску, и Джоссатиса.
По поводу лямбд лучше почитать самого Страуструпа.

А бывают только новички и матерые волки, средних нету  smile 





PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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