0

CPU: Core2 Duo
Оперативная память: 4 GB
OS: Windows 7 64-бит
IDE: Код :: Blocks 16,0
Компилятор:TDM-GCC MinGW
IT Уровень : Newb пытается научиться C++.Почему иногда std :: cout не хватает и требуется использовать пространство имен std?

Я использовал следующий код для тестирования компилятора:

#include <iostream> 
#include <string> 
using namespace std; 
auto add([](auto a, auto b){ return a+b ;}); 
auto main() -> int {cout << add("We have C","++14!"s);} 

без ошибок. Консольный вывод «We have C++14!» подтвердил, что компилятор соответствует стандарту ISO/IEC 14882: 2014 языка программирования C++, а также C++ 14.

Затем я попытался «оптимизировать» код, комментируя using namespace std; и заменяя cout на std::cout. Теперь код выглядит следующим образом:

#include <iostream> 
#include <string> 
//using namespace std; 
auto add([](auto a, auto b){ return a+b ;}); 
auto main() -> int {std::cout << add("We have C","++14!"s);} 

Строительные Сообщения:

||=== Build: Release in c++14-64 (compiler: GNU GCC Compiler) ===| 
C:\CBProjects\c++14-64\c++14-64-test.cpp||In function 'int main()':| 
C:\CBProjects\c++14-64\c++14-64-test.cpp|5|error: unable to find string literal operator 'operator""s' with 'const char [6]', 'long long unsigned int' arguments| 
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

Вопросы:

  • Что вызывает ошибку во второй программе?
  • Как можно избежать страшного using namespace std?

EDIT Тот факт, что я решил задать этот вопрос здесь означает, что, несмотря на мои искренние усилия, я не смог решить эту проблему. Цель вопроса - найти ответ. Да, я понимаю - теперь, когда на вопрос был дан ответ - что решение ускользнуло от меня, потому что я понятия не имел, что такое «оператор строковых литералов», а компилятор GNU GCC не имеет наиболее удобных для начинающих сообщений об ошибках. Как я уже говорил в «заголовке» этого вопроса, я новичок. Я нахожусь в самом начале C++. Я только что установил Code :: Blocks и компилятор TDM-GCC MinGW, потому что мне нужен C++ 14 и возможность создавать 32-битные и 64-разрядные исполняемые файлы. Тот факт, что этот вопрос получил такой исчерпывающий ответ, означает, что сам вопрос заслуживает внимания, и некоторые люди считают, что вопрос и ответ могут быть полезны для других людей в будущем. Я новичок на этом сайте, и каждый downvote затрудняет мне поддержку ответа. Моя репутация снизилась на 20%, потому что кто-то занижал этот вопрос после того, как было дан ответ.

Если вы должны понизить, можете ли вы хотя бы указать на проблему? Благодаря!

+4

Это 's' суффикс на строковый литерал, а не' cout'. 'using std :: operator" "s' – Ryan

+2

@Ryan' using namespace std :: string_literals; 'более традиционный подход. –

ответ

3

clang++ дает хорошее сообщение об ошибке:

error: no matching literal operator for call to 'operator""s' with arguments of types 'const char *' and 'unsigned long', and no matching literal operator template 
auto main() -> int { std::cout << add("We have C", "++14!"s); } 
                 ^

Вы используете строковые литералы и более точно operator""s.

Удаляя using namespace std;, вы должны указать пространство имен, в котором определяется оператор.

С явным вызовом:

int main() { 
    std::cout << add("We have C", std::operator""s("++14!", 5)); 
    // Note the length of the raw character array literal is required 
} 

или с using декларации:

int main() { 
    using std::operator""s; 
    std::cout << add("We have C", "++14!"s); 
} 
+0

Предпочитаете использовать пространство имен std :: string_literals'. –