2013-03-20 6 views
2

Я получаю ошибку компиляции, говоря, что «left» и «right» неоднозначны.Ошибка компиляции: левая неоднозначная, правая неоднозначная

Я объявляю левый, право в неправильном месте?

  • Декларирование внутри основной не помогает
  • Moving определение функции выше основной не поможет

Как мне это исправить?

Минимальный тест:

#include <iostream> 
using namespace std; 
int left = 0, right = 0; 
int main() 
{ 
    cout << left; 
    cout << right; 
} 

дает:

prog.cpp: In function ‘int main()’: 
prog.cpp:6:13: error: reference to ‘left’ is ambiguous 
prog.cpp:3:5: error: candidates are: int left 
In file included from /usr/include/c++/4.7/ios:43:0, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from prog.cpp:1: 
/usr/include/c++/4.7/bits/ios_base.h:918:3: error: 
      std::ios_base& std::left(std::ios_base&) 
prog.cpp:7:13: error: reference to ‘right’ is ambiguous 
prog.cpp:3:15: error: candidates are: int right 
In file included from /usr/include/c++/4.7/ios:43:0, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from prog.cpp:1: 
/usr/include/c++/4.7/bits/ios_base.h:926:3: error: 
      std::ios_base& std::right(std::ios_base&) 
+3

Совет на будущее - постройте [минимальный тестовый пример] (https://ideone.com/c2DqtQ) и вставьте код в вопрос, а не только ссылку на него. – Dukeling

+0

Я просто не могу понять форматирование кода на этом сайте! – user1776433

+0

Теперь вы знаете, почему вы не делаете 'using namespace std;'! –

ответ

3

Обратите внимание на сообщение об ошибке:

raw.cpp:105: error: reference to ‘right’ is ambiguous 
raw.cpp:5: error: candidates are: int right 
/usr/include/c++/4.2.1/bits/ios_base.h:917: error: 
    std::ios_base& std::right(std::ios_base&) 

Это устрашающее читать, но в основном это то, что он говорит:

raw.cpp:105: error: There's more than one ‘right’ here 
One of them is yours: raw.cpp:5 int right 
Another one isn't: <bits/ios_base.h:917>: some crap in namespace ‘std’ 

So left и right уже определены в namespace std, в котором вы хотите импортировать все из using namespace std. Вот почему у вас есть двусмысленность. Самое простое исправление - удалить using namespace std; и добавить using std::cin; using std::cout;, но это похоже на слишком много глобальных переменных для моего вкуса.

Кстати, вы должны включить свой код в свой вопрос. Вопрос может быть здесь дольше, чем эта паста, и мой ответ не имеет смысла, если никто не сможет увидеть весь вопрос.

+0

Я не знал, что слева и справа определены в пространстве имен std, я изменил их на lft и rght. Спасибо. – user1776433

+1

Если бы вы были в моем классе, я бы бросил вам класс письма только для этих новых имен переменных. Как насчет 'left_index' или' deque_left'? –

+0

Или не используйте 'using namespace std;', но префикс элементов, которые вы хотите от него, с помощью 'std ::', или укажите, что именно вы импортируете из 'std'. (Я думаю, что ':: left' и' :: right' тоже будут работать, но я не уверен, что рекомендую обозначение.) –

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