- 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 Метки нет (Все метки)
Всем доброго времени суток! Компилятор выдают ошибку в следующем коде:
Подскажите, пожалуйста, в чём проблема.
__________________
0 |
Croessmah Don’t worry, be happy 17781 / 10545 / 2036 Регистрация: 27.09.2012 Сообщений: 26,516 Записей в блоге: 1 |
||||
07.08.2013, 21:19 |
2 |
|||
может отказаться от этого?
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 |
|||
Подскажите, пожалуйста, в чём проблема. В пространстве имен std уже есть distance http://www.cplusplus.com/refer… /distance/ отсюда и ошибка Добавлено через 1 минуту
Как же я буду программировать без этого! Так же как и раньше
Писать каждый раз перед cout или cin «std::» — лень и неудобно. есть просто using, если уж совсем в лом
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 |
|||
Можно еще так
1 |
Croessmah |
07.08.2013, 21:26
|
Не по теме:
Можно еще так нельзя, ибо, using namespace my; даст туже ошибку, а без него нельзя:
Как же я буду программировать без этого!
Писать каждый раз перед cout или cin «std::» — лень и неудобно.
0 |
Kastaneda |
07.08.2013, 21:27
|
Не по теме:
нельзя, ибо, using namespace my; даст туже ошибку, а без него нельзя точняк, ща еще подумаю
0 |
Croessmah |
||||
07.08.2013, 21:28
#9 |
||||
Не по теме:
точняк, ща еще подумаю можно
еще писать, но опять же лишние двоеточия
0 |
Kastaneda 5225 / 3197 / 362 Регистрация: 12.12.2009 Сообщений: 8,101 Записей в блоге: 2 |
||||
07.08.2013, 21:29 |
10 |
|||
во что придумал
ching0n, только некому не говори, что на cyberforum’е такое советуют
0 |
ching0n |
07.08.2013, 21:34 [ТС] |
Не по теме: Харэ прикалываться!
0 |
Olivеr 414 / 410 / 95 Регистрация: 06.10.2011 Сообщений: 832 |
||||
08.08.2013, 04:41 |
12 |
|||
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
1 |
Don’t worry, be happy 17781 / 10545 / 2036 Регистрация: 27.09.2012 Сообщений: 26,516 Записей в блоге: 1 |
|
08.08.2013, 09:54 |
15 |
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
|
Не по теме:
надо просто использовать distance до using namespace std; Как можно пропустить святой using namespace std? Богохульник
0 |
bemol5 |
09.08.2013, 00:24
|
Не по теме: Лучше не использовать namespace std вначале изучения С++ ?
0 |
5493 / 4888 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
09.08.2013, 01:17 |
19 |
Не по теме:
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.hwhen 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 addressif 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 lineusing 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 //
///////////