неоднозначная ошибка: шаблон C ++ - PullRequest
1 голос
/ 05 июня 2011

Я перепробовал почти все мыслимые (кроме правильных вещей, конечно), но все еще не понимаю, почему я получаю неоднозначную ошибку.Я уверен, что это что-то действительно глупое, но я просто не вижу этого!Мой компилятор показывает предупреждения с помощью операторов вставки, и я знаю, что они оба вызываются, но мне сказали, что вставка в старом virtual поможет мне там (а это не ...), пока еще нет!

#include<iostream>
#include<iomanip>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

template <class T>
T produceReport(string title, T accType, int tableRows)
{
    cout << title << endl;
    for (int x = 0; x < tableRows; x++)
    {
        cout << "-";
    }
    cout << endl << accType;
};

class BankAccount
{
private:
    int accNum;
    double accBal;
public:
    BankAccount(int = 0, double = 0.0);
    void enterAccountData();
    void displayAccount();
}; 

BankAccount::BankAccount(int num, double bal)
{
    accNum = num;
    accBal = bal;
} 

void BankAccount::enterAccountData()
{
    cout << setprecision(2) << fixed;

    const int MIN_ACC = 1000, MAX_ACC = 9999, DEFAULT = 0; 

    cout << "Enter account number: ";
    cin >> accNum; 

    if (accNum < MIN_ACC || accNum > MAX_ACC)
        accNum = DEFAULT; 

    cout << "Enter account balance: $";
    cin >> accBal;
} 

void BankAccount::displayAccount()
{
    cout << "Account#" << accNum <<
        ", Balance: $" << accBal << endl;
} 

class SavingsAccount: virtual public BankAccount
{
    friend ostream& operator<<(ostream&, SavingsAccount);
protected:
    double intRate;
public:
    SavingsAccount(double = 0.0);
    void getSavAccount();
    void displayAccount();
};

SavingsAccount::SavingsAccount(double rate)
{
    intRate = rate;
} 

void SavingsAccount::getSavAccount()
{
    cout << "Enter interest rate: ";
    cin >> intRate; 
} 

ostream& operator<<(ostream& out, SavingsAccount savAcc)
{
    savAcc.displayAccount();
    return out;
} 

void SavingsAccount::displayAccount()
{
    BankAccount::displayAccount();
    cout << "Interest rate is: " << intRate << endl;
} 

class CheckingAccount: virtual public BankAccount
{
    friend ostream& operator<<(ostream&, CheckingAccount);
private:
    double monthFee;
    int numChecks;
public:
    CheckingAccount(int = 0, double = 0.0, double = 0.0, int = 0);
    void getCheckAccount();
    void displayAccount();
}; 

CheckingAccount::CheckingAccount(int num, double bal, double fee, int check):
BankAccount(num, bal), monthFee(fee), numChecks(check)
{} 

void CheckingAccount::getCheckAccount()
{
    cout << "Enter monthly fee for account: $";
    cin >> monthFee;
    cout << "Enter number of checks remaining: ";
    cin >> numChecks;
} 

ostream& operator<<(ostream& out, CheckingAccount checkAcc)
{
    checkAcc.displayAccount();
    return out;
}

void CheckingAccount::displayAccount()
{
    BankAccount::displayAccount();
    cout << "Monthly fee on account is: $" << monthFee << endl;
    cout << "Checks remaining for account: " << numChecks << endl << endl;
} 

class CheckingAccountWithInterest: public SavingsAccount, public CheckingAccount
{
public:
    CheckingAccountWithInterest();
    void displayAccount();
}; 

CheckingAccountWithInterest::CheckingAccountWithInterest():
CheckingAccount(), SavingsAccount()
{} 

void CheckingAccountWithInterest::displayAccount()
{
    BankAccount::displayAccount();
    intRate = 0.02;
    SavingsAccount::displayAccount();
    CheckingAccount::displayAccount();
} 

int main()
{
    const int NUM_ACCS = 5;
    unsigned count;
    vector<SavingsAccount> savAcc;
    SavingsAccount aSavAcc;
    vector<CheckingAccount> checkAcc;
    CheckingAccount aCheckAcc;
    vector<CheckingAccountWithInterest> checkAccWithInt;
    CheckingAccountWithInterest aCheckAccWithInt;

    for (count = 0; count < NUM_ACCS; count++)
    {
        aSavAcc.enterAccountData();
        aSavAcc.getSavAccount();
        savAcc.push_back(aSavAcc);
    }
    for (count = 0; count < NUM_ACCS; count++)
    {
        aCheckAcc.enterAccountData();
        aCheckAcc.getCheckAccount();
        checkAcc.push_back(aCheckAcc);
    }
    for (count = 0; count < NUM_ACCS; count++)
    {
        aCheckAccWithInt.enterAccountData();
        aCheckAccWithInt.getSavAccount();
        aCheckAccWithInt.getCheckAccount();
        checkAccWithInt.push_back(aCheckAccWithInt);
    }
    cout << endl;
    for (count = 0; count < NUM_ACCS; count++)
    {
        produceReport("Savings Account Information", savAcc.at(count), 25);
    }
    for (count = 0; count < NUM_ACCS; count++)
    {
        produceReport("Checking Account Information", checkAcc.at(count), 25);
    }
    for (count = 0; count < NUM_ACCS; count++)
    {
        produceReport("Checking Account With Interest Information", checkAccWithInt.at(count), 30);
    }
}

Ошибка при вызове cout << endl << accType;

template <class T>
    T produceReport(string title, T accType, int tableRows)
    {
        cout << title << endl;
        for (int x = 0; x < tableRows; x++)
        {
            cout << "-";
        }
        cout << endl << accType;
    };

ProduceReport.cpp:16: error: ambiguous overload for 'operator<<' in 'std::cout. std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](std::endl [with _CharT = char, _Traits = std::char_traits<char>]) << accType'

- это сообщение об ошибке.

Любая помощь или советы приветствуютсякак обойти эту ошибку!

1 Ответ

7 голосов
/ 05 июня 2011

CheckingAccountWithInterest наследуется от двух классов. Они оба поддерживают operator<<, который с равной вероятностью будет тем, который CheckingAccountWithInterest должен использовать. Не имеет значения, что они оба называют displayAccount(); Неопределенность возникает еще до того, как компилятор туда попадет. Вам нужно разобраться с этой двусмысленностью.

...