2015-12-22 3 views
1
#include <iostream> 
#include <array> 

using namespace std; 

int main() 
{ 
    array<int, 5> a = {1,2,3,4,5}; 

    auto it = find(a.cbegin(), a.cend(), 3); 
    cout << *it << endl; 
    return 0; 
} 

Программа хорошо работает с VS 2015, но не скомпилируется с использованием gcc. Код неправильный? Сообщение об ошибке:std :: find() не может скомпилироваться с gcc

error: no matching function for call to ‘find(std::array<int, 5ul>::const_iterator, std::array<int, 5ul>::const_iterator, int)’ 

ответ

4

Вы должны

#include <algorithm> 

Это где std::find жизнь. Кажется, что с MSVC вы получаете его через некоторые транзитивные включите в <iostream> или <array>.

Я также предлагаю квалифицировать имена стандартных компонентов библиотеки полностью, например std::array и std::find, а не using namespace std;. См. here или here. Это дает понять, что вы пытаетесь использовать стандартную библиотеку find, а не что-то другое.

Рекомендуется проверять, что ваш find действительно что-то нашел, прежде чем пытаться его распечатать. Если вы попытались присвоить find значение, которого нет, то его печать вызовет Undefined Behaviour, что является плохим.

auto it = std::find(a.cbegin(), a.cend(), 3); 
if (a.cend() == it) { 
    std::cout << "Couldn't find value!\n"; 
    return 1; 
} 
std::cout << *it << '\n'; 
return 0; 

Я тоже не большой поклонник std::endl. Знаете ли вы, что он пишет '\n'и снимает поток? Многие люди не понимают, что это 2 вещи, что делает цель вашего кода намного менее ясной. Когда я прочитал его, я не знаю, действительно ли тот, кто его написал, действительно хотел сбросить поток, или просто не знал, что std::endl делает это. Я предпочитаю просто использовать

std::cout << '\n'; 

, или, если вы действительно хотите, чтобы вручную очистить поток (маловероятно), то явно об этом:

std::cout << '\n' << std::flush; 
Смежные вопросы