Cout is ambiguous c ошибка

  • Forum
  • General C++ Programming
  • Cout is ambiguous?

Cout is ambiguous?

What does that mean? How do I fix it?

Post the actual error message, as well as the line of code which is causing the error.

Post your code so that it is [code]between code tags[/code] as this will give it syntax highlighting and line numbers.

Please copy and paste the exact error message, and indicate which line the error is talking about.

Last edited on

Well, I am working on this bank database project and whenever I post this part:

void addaccount()
{
ifstream inData;
ofstream outData;
string fileName;
string str;
cout << «Insert the name of the data file: «;
cin >> fileName;
inData.open(fileName); // Access the file of the name you had inputted
string lastName, firstName, type;
double balance;
inData >> lastName >> firstName >> balance >> type;
cout << «What file would you like to save the data in?: «;
cin >> fileName;
outData.open(fileName);
outData << str;
cout << «nEnter the customer’s last name:»;
cin >> lastName;
cout << «nnEnter the customer’s first name : «;
cin >> firstName;
cin.ignore();
cin.getline(50, firstName);
cout << «nEnter Type of The account (C/S) : «;
cin >> type;
type = toupper(type);
cout << «nEnter The Initial amount(>=500 for Saving and >=1000 for current ) : «;
cin >> deposit;
cout << «nnnAccount Created.»;
}

void deleteaccount();
{
account ac;
ifstream inFile;
ofstream outFile;
inFile.open(«account.dat», ios::binary);
if (!inFile)
{
cout << «File could not be open !! Press any Key…»;
return;
}
outFile.open(«Temp.dat», ios::binary);
inFile.seekg(0, ios::beg);
while (inFile.read(reinterpret_cast<char *> (&ac), sizeof(account)))
{
if (ac.retacno() != n)
{
outFile.write(reinterpret_cast<char *> (&ac), sizeof(account));
}
}
inFile.close();
outFile.close();
remove(«account.txt»);
rename(«Temp.txt», «account.txt»);
cout << «nntRecord Deleted ..»;
}

void search();
{
int seqSearch(const int list[], int listLength, int searchItem)
{
int loc;
bool found = false;

for (loc = 0; loc < listLength; loc++)
if (list[loc] == searchItem)
{
found = true;
break;
}
if (found)
return loc;
else
return -1;
}

into it, all the couts get the error message IntelliSense: «cout» is ambiguous.

Speaking of which, I really need help with that. I have a topic called ‘Bank Database’ I could really use help with.

IntelliSense errors aren’t compilation errors. Sometimes IntelliSense can get confused or out of date.

Go to Build -> Rebuild

You may also consider trying to prefix your ‘cout’ object with its namespace, ‘std’. In other words, wherever you’ve put

cout << "Information";

You may consider putting

std::cout << "Information";

Perhaps there are multiple objects called ‘cout’ in your program (or you’ve included external libraries which also have a cout object) and providing a namespace might give some clarification as to which one you mean.

Topic archived. No new replies allowed.

Я не знаком с шаблонами. Я только начал изучать это. Почему я получаю ошибки в следующей программе?

#include <iostream>
#include <string>
using std::cout;
using std::string;
template<class C>
C min(C a,C b) {
return a<b?a:b;
}
int main()
{
string a="first string";
string b="second string";
cout<<"minimum string is: "<<min(a,b)<<'n';
int c=3,d=5;
cout<<"minimum number is: "<<min(c,d)<<'n';
double e{3.3},f{6.6};
cout<<"minimum number is: "<<min(e,f)<<'n';
char g{'a'},h{'b'};
cout<<"minimum number is: "<<min(g,h)<<'n';
return 0;
}

Ошибки:

13  [Error] call of overloaded 'min(std::string&, std::string&)' is ambiguous

6   [Note] C min(C, C) [with C = std::basic_string<char>]

Пожалуйста, помогите мне.

11

Решение

Здесь происходит две вещи.

Ваша первая проблема заключается в том, что вы включили только часть сообщения об ошибке. Вот ссылка на код, выполняемый в gcc и clang, и одно из полученных сообщений об ошибке (полностью):

main.cpp:13:34: error: call to 'min' is ambiguous
cout<<"minimum string is: "<<min(a,b)<<'n';
^~~
/usr/include/c++/v1/algorithm:2579:1: note: candidate function [with _Tp = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
min(const _Tp& __a, const _Tp& __b)
^
main.cpp:6:3: note: candidate function [with C = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
C min(C a,C b) {
^

Есть два кандидата. Один в main.cpp:6:3 (строка 6, символ 3) и один на algorithm:2579:1 (строка 2579, символ 1).

Один из них ты написал, а один из них в #include <algorithm>,

Один из ваших заголовочных файлов включен <algorithm> без тебя об этом. Стандартные заголовки могут делать это, как бы это ни раздражало.

В <algorithm> Eсть std::min шаблон функции. Как std::string это экземпляр класса шаблона в namespace std, шаблон функции std::min обнаруживается с помощью процесса, называемого «поиск с учетом аргументов» или «поиск по Кенигу». (Кандидаты перегрузки функции ищутся локально, а также в пространствах имен аргументов функции, а также в пространствах имен аргументов шаблона для аргументов функции и в пространствах имен вещей, на которые указывают аргументы объекта. функция и т. д.)

Ваша местная функция min также находится в том же пространстве имен, что и тело main,

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

И gcc и clang делают error: затем последовательность note:s. Обычно все из note:s после ошибки важны для понимания ошибки.

Чтобы это исправить, попробуйте позвонить ::min (полностью квалифицируя вызов), или переименовав функцию во что-то другое, или сделайте вашу версию более подходящей, чем std::min (сложно, но выполнимо в некоторых случаях), или вызов (min)(a,b), Последний блокирует поиск ADL / Koenig, а также блокирует раскрытие макроса (например, если какая-то ОС вставила #define min макросы в их системные заголовки) (через @ 0x499602D2).

14

Другие решения

Вы столкнулись с именным столкновением с std::min, Скорее всего, он включен в один из других стандартных заголовков библиотеки, которые вы включили, либо <iostream> или же <string>моё предположение, вероятно, последнее. Быстрое решение состоит в том, чтобы переименовать вашу функцию. Например, переименовав его в mymin работает отлично. демонстрация

5

Ok I am trying to port my vending machine program from Java to C++, this isn’t going a smoothly as I had planned however. And I get the following errors whenever I try to use cout.

C2872: ‘cout’ : ambiguous symbol
 C2679: binary ‘<<‘ : no operator defined which takes a right-hand operand of type ‘class std::basic_string<char,struct std::char_traits<char>,class std::allocator
<char> >’ (or there is no acceptable conversion)

I have to files a header file called classes.h and main file called vmachine.cpp. I am using MSVC++ 6. Here is the code respectively.


/*This file contains all the classes necessary to
 *operate the main vending machine program
 */

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

class Bank {
public:
    Bank();
    ~Bank() {}
    int addCred(int addCred) {
        currCred += addCred;
        totalCred += addCred;
        return currCred;
    }
    int giveChange(int deductCred){
        currCred -= deductCred;
        totalCred -= deductCred;
        return currCred;
    }
    void updateCred(int cred) { currCred = cred; }
    int getCred() { return currCred; }
private:
    int currCred;
    int totalCred;
};

Bank::Bank() {
    currCred = 0;
    totalCred = 2000;
}

class Display {
public:
    Display();
    ~Display() {}
    void showDisplay(string displayText) {        
        text = displayText;        
        cout<<«DISPLAY:: » <<text;
    }
    void clear() {
       text = «READY»;       
       showDisplay(text);
    }
private:
    string text;
};

Display::Display() {}

class Keypad {
public:
    Keypad();
    ~Keypad() {}
    string getCode() {
//        cin.getline((char*)code.data(), 10, ‘n’);        
        strupr((char*)code.data());
        return code;
    }
private:
    string code;
};

Keypad::Keypad() {}

class Product{
    public:
        // default constructor (an added benefit is that it can
        // be initalized with a string literal)
        Product(const char* itsName = «», int itsPrice = 0):
          name(itsName), price(0)
          {}
        // normal constructor
        Product(const string& itsName, int itsPrice):
        name(itsName), price(itsPrice)            {}
        // if your destructor doesn’t need to do anything,
        // you don’t need to implement one
        // since these functions don’t modify the object (and shouldn’t), mark them as const
        const string& getName() const {return name;}
        int getPrice() const {return price;}
    private:
        string name;
        int price;
};

class Tray{
    public:
        Tray(const char* itsCode = «»):
          code(itsCode), prod()
          {}
        Tray(const string& itsCode, const Product& trayItem):
          limit(20), quantity(20), code(itsCode), prod(trayItem)
          {}
          // I’m guessing that you don’t need a deconstructor here, either
          const string& getCode() const {return code;}
          const Product& getProduct() const {return prod;}
          int getQuant() const {return quantity;}
          void dispense() {—quantity;}
    private:
        int limit;
        int quantity;
        string code;
        Product prod;
};


#include <iostream.h>
#include <string>
#include «classes.h»
using namespace std;

Tray *tray_prod_init() {

    Tray *t_array = new Tray[20];

    //Set up List of Products

    Product mars(«Mars»,40);
    Product Snickers(«Snickers»,40);
    Product Wispa(«Wispa»,35);   

    //Set up List of trays
    Tray A1(«A1»,mars);
    Tray A2(«A2»,Snickers);
    Tray A3(«A3»,Wispa);   

    //Assign position in array for each tray

    t_array[0] =  A1;
    t_array[1] =  A2;
    t_array[2] =  A3;    

    return t_array;

}

void interface1(Tray tList[],Bank* moneyBag,Display* display,Keypad* keypad) {    

}

void interface2(Tray tList[],Bank* moneyBag,Display* display,Keypad* keypad) {

}

void interface3(Tray tList[],Bank* moneyBag,Display* display,Keypad* keypad) {

}

void main() {

    //Create objects needed
    Tray* tList = tray_prod_init();    // use tList
    Bank* moneyBag = new Bank();
    Display* display = new Display();
    Keypad* keypad = new Keypad();

    //Run the interface menu
    interface1(tList,moneyBag,display,keypad);

    //Delete objects
    delete[] tList; // MAKE SURE YOU DO THIS WHEN YOU’RE DONE!!!
    delete moneyBag;
    delete display;
    delete keypad;

}

ching0n

3 / 3 / 3

Регистрация: 06.08.2013

Сообщений: 23

1

07.08.2013, 21:13. Показов 39200. Ответов 18

Метки нет (Все метки)


Всем доброго времени суток! Компилятор выдают ошибку в следующем коде:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
struct distance
{
    int feet;
    float inches;
};
 
int main()
{
    distance d1; // Здесь выдаёт ошибку "reference to 'distance' is ambiguous"
    distance d3;
    distance d2 = { 11, 6.25 };
    ...

Подскажите, пожалуйста, в чём проблема.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Croessmah

Don’t worry, be happy

17781 / 10545 / 2036

Регистрация: 27.09.2012

Сообщений: 26,516

Записей в блоге: 1

07.08.2013, 21:19

2

C++
1
using namespace std;

может отказаться от этого?



0



3 / 3 / 3

Регистрация: 06.08.2013

Сообщений: 23

07.08.2013, 21:20

 [ТС]

3

Croessmah, ты что! Как же я буду программировать без этого! Писать каждый раз перед cout или cin «std::» — лень и неудобно.



0



Croessmah

Don’t worry, be happy

17781 / 10545 / 2036

Регистрация: 27.09.2012

Сообщений: 26,516

Записей в блоге: 1

07.08.2013, 21:22

4

Цитата
Сообщение от ching0n
Посмотреть сообщение

Подскажите, пожалуйста, в чём проблема.

В пространстве имен std уже есть distance http://www.cplusplus.com/refer… /distance/ отсюда и ошибка

Добавлено через 1 минуту

Цитата
Сообщение от ching0n
Посмотреть сообщение

Как же я буду программировать без этого!

Так же как и раньше

Цитата
Сообщение от ching0n
Посмотреть сообщение

Писать каждый раз перед cout или cin «std::» — лень и неудобно.

есть просто using, если уж совсем в лом

C++
1
2
using std::cout ;
using std::cin ;



3



3 / 3 / 3

Регистрация: 06.08.2013

Сообщений: 23

07.08.2013, 21:23

 [ТС]

5

Croessmah, понятно. Переименовал на «dis» — всё заработало! Спасибо!



0



Kastaneda

5225 / 3197 / 362

Регистрация: 12.12.2009

Сообщений: 8,101

Записей в блоге: 2

07.08.2013, 21:24

6

Можно еще так

C++
1
2
3
4
5
6
7
8
9
namespace my {
struct distance
{
    int feet;
    float inches;
};
} 
...
my::distance d1;



1



Croessmah

07.08.2013, 21:26

Не по теме:

Цитата
Сообщение от Kastaneda
Посмотреть сообщение

Можно еще так

нельзя, ибо, using namespace my; даст туже ошибку, а без него нельзя:

Цитата
Сообщение от ching0n
Посмотреть сообщение

Как же я буду программировать без этого!

Цитата
Сообщение от ching0n
Посмотреть сообщение

Писать каждый раз перед cout или cin «std::» — лень и неудобно.

:D



0



Kastaneda

07.08.2013, 21:27

Не по теме:

Цитата
Сообщение от Croessmah
Посмотреть сообщение

нельзя, ибо, using namespace my; даст туже ошибку, а без него нельзя

точняк, ща еще подумаю :)



0



Croessmah

07.08.2013, 21:28

 

#9

Не по теме:

Цитата
Сообщение от Kastaneda
Посмотреть сообщение

точняк, ща еще подумаю

можно

C++
1
::distance

еще писать, но опять же лишние двоеточия :)



0



Kastaneda

5225 / 3197 / 362

Регистрация: 12.12.2009

Сообщений: 8,101

Записей в блоге: 2

07.08.2013, 21:29

10

во что придумал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define distance __distance
#include <iostream>
#undef distance 
 
using namespace std;
 
struct distance
{
    int feet;
    float inches;
};
 
int main()
{
    distance d1; 
    return 0;
}

ching0n, только некому не говори, что на cyberforum’е такое советуют



0



ching0n

07.08.2013, 21:34

 [ТС]

Не по теме:

Харэ прикалываться! :)
Kastaneda, :D



0



Olivеr

414 / 410 / 95

Регистрация: 06.10.2011

Сообщений: 832

08.08.2013, 04:41

12

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
struct distance
{
    int feet;
    float inches;
};
 
int main()
{
    using distance = ::distance;
    distance d1;
    return 0;
}



0



3 / 3 / 3

Регистрация: 06.08.2013

Сообщений: 23

08.08.2013, 07:09

 [ТС]

13

Olivеr, выдаёт ошибку: «expected nested-name-specifier before ‘distance'»



0



Olivеr

414 / 410 / 95

Регистрация: 06.10.2011

Сообщений: 832

08.08.2013, 08:07

14

ching0n, http://ideone.com/jCwwgC
можно и тайпдефом

C++
1
typedef ::distance distance;



1



Don’t worry, be happy

17781 / 10545 / 2036

Регистрация: 27.09.2012

Сообщений: 26,516

Записей в блоге: 1

08.08.2013, 09:54

15

Цитата
Сообщение от ching0n
Посмотреть сообщение

Olivеr, выдаёт ошибку: «expected nested-name-specifier before ‘distance'»

C++11 ну или вариант с typedef’ом



0



:)

Эксперт С++

4773 / 3267 / 497

Регистрация: 19.02.2013

Сообщений: 9,046

08.08.2013, 10:43

16

надо просто использовать distance до using namespace std;



0



Croessmah

08.08.2013, 11:38

Не по теме:

Цитата
Сообщение от Tulosba
Посмотреть сообщение

надо просто использовать distance до using namespace std;

Как можно пропустить святой using namespace std? Богохульник :D



0



bemol5

09.08.2013, 00:24

Не по теме:

Лучше не использовать namespace std вначале изучения С++ ?



0



5493 / 4888 / 831

Регистрация: 04.06.2011

Сообщений: 13,587

09.08.2013, 01:17

19

Цитата
Сообщение от bemol5
Посмотреть сообщение

Не по теме:
Лучше не использовать namespace std вначале изучения С++ ?



1



I recently got ms visual studio 6.0 and the c++ compiler complains with all commands using << saying that they are ambiguous, I tried programs that I created (and that worked) at school and got the same ambiguous error, how might I fix this? thnx

Comments

  • : I recently got ms visual studio 6.0 and the c++ compiler complains with all commands using << saying that they are ambiguous, I tried programs that I created (and that worked) at school and got the same ambiguous error, how might I fix this? thnx
    :

    Dam Microsoft crap heh I for one would be pissed also..
    I can’t live without the iostream.h package
    i dont under stand that printf() stuff never cared
    heh
    well it looks like your gonna have to start using printf
    its in the stdio.h

    when you figure it out.. tell me what that %d and %s etc.
    stuff is all about…
    -Roach

  • : I recently got ms visual studio 6.0 and the c++ compiler complains with all commands using << saying that they are ambiguous, I tried programs that I created (and that worked) at school and got the same ambiguous error, how might I fix this? thnx
    :

    I’m using Visual C++6 and never have any problems with cout or cin commands.

    To run these commands do the following:
    Create a workspace project
    Create a C++ source file for your source code
    Include the <iostream> header file — e.g. #include
    State that you will be using cout & cin — e.g. using std::cin;
    You should have no problems if these directions are followed.

  • : when you figure it out.. tell me what that %d and %s etc.
    : stuff is all about…
    : -Roach
    :
    %d is for displaying decimal numbers
    i.e.

    printf(«%d plus %d equals %d», 1, 2, 1+2);
    %o (not zero) is for displaying numbers in their octal value
    %x is for displaying numbers in their hexadecimal value
    %c is for displaying chars
    %e is for displaying exponential values
    %g = floating point values
    %s = strings
    %p = pointer address

    if you want to have the plus or minus sign in front of the number you insert a plus sign between the percent sign and the letter i.e. %+d

  • : I recently got ms visual studio 6.0 and the c++ compiler complains with all commands using << saying that they are ambiguous, I tried programs that I created (and that worked) at school and got the same ambiguous error, how might I fix this? thnx
    :
    One way to fix it and make life easier on yourself is to include the line

    using namespace std;

    after your include statements. This line will allow you access to all of the standard libraries with no headaches.

  • : : when you figure it out.. tell me what that %d and %s etc.
    : : stuff is all about…
    : : -Roach
    : :
    : %d is for displaying decimal numbers
    : i.e.
    :
    : printf(«%d plus %d equals %d», 1, 2, 1+2);
    : %o (not zero) is for displaying numbers in their octal value
    : %x is for displaying numbers in their hexadecimal value
    : %c is for displaying chars
    : %e is for displaying exponential values
    : %g = floating point values
    : %s = strings
    : %p = pointer address
    :
    : if you want to have the plus or minus sign in front of the number you insert a plus sign between the percent sign and the letter i.e. %+d
    :
    oh ok i get it.. so its like saying
    int numb, numb2;
    cout << numb << » Plus » << numb2 << » Equals: » << numb+numb2;
    ok thats cool…
    ///////////
    // Roach //
    ///////////

Понравилась статья? Поделить с друзьями:
  • Cout does not name a type error
  • Country not allowed как исправить ошибку
  • Counter strike source как изменить язык
  • Counter strike source как изменить прицел
  • Counter strike launcher error