Неверное объявление функции. DevC ++ - PullRequest
0 голосов
/ 05 мая 2010

Почему я получаю недопустимое объявление функции, когда я компилирую код в DevC ++ в Windows, но когда я компилирую его в CodeBlocks в Linux, он работает нормально.

#include <iostream>
#include <vector>


using namespace std;

//structure to hold item information
struct item{
    string name;
    double price;
};

//define sandwich, chips, and drink
struct item sandwich{"Sandwich", 3.00};    **** error is here *****
struct item chips{"Chips", 1.50};          **** error is here *****
struct item drink{"Large Drink", 2.00};    **** error is here *****

vector<item> cart;          //vector to hold the items
double total = 0.0;         //total
const double tax = 0.0825;  //tax

//gets item choice from user
char getChoice(){

    cout << "Select an item:" << endl;
    cout << "S: Sandwich. $3.00" << endl;
    cout << "C: Chips. $1.50" << endl;
    cout << "D: Drink. $2.00" << endl;
    cout << "X: Cancel. Start over" << endl;
    cout << "T: Total" << endl;

    char choice;
    cin >> choice;
    return choice;
}

//displays current items in cart and total
void displayCart(){
    cout << "\nCart:" << endl;
    for(unsigned int i=0; i<cart.size(); i++){
        cout << cart.at(i).name << ". $" << cart.at(i).price << endl;
    }
    cout << "Total: $" << total << endl << endl;
}

//adds item to the cart
void addItem(struct item bought){
    cart.push_back(bought);
    total += bought.price;
    displayCart();
}

//displays the receipt, items, prices, subtotal, taxes, and total
void displayReceipt(){

    cout << "\nReceipt:" << endl;
    cout << "Items: " << cart.size() << endl;
    for(unsigned int i=0; i<cart.size(); i++){
        cout << (i+1) << ". " << cart.at(i).name << ". $" << cart.at(i).price << endl;
    }
    cout << "----------------------------" << endl;
    cout << "Subtotal: $" << total << endl;

    double taxes = total*tax;
    cout << "Tax: $" << taxes << endl;

    cout << "Total: $" << (total + taxes) << endl;


}




int main(){

    //sentinel to stop the loop
    bool stop = false;
    char choice;
    while (stop == false ){

        choice = getChoice();

        //add sandwich
        if( choice == 's' || choice == 'S' ){
            addItem(sandwich);
        }
        //add chips
        else if( choice == 'c' || choice == 'C' ){
            addItem(chips);
        }
        //add drink
        else if( choice == 'd' || choice == 'D' ){
            addItem(drink);
        }
        //remove everything from cart
        else if( choice == 'x' || choice == 'X' ){
            cart.clear();
            total = 0.0;
            cout << "\n***** Transcation Canceled *****\n" << endl;
        }
        //calcualte total
        else if( choice == 't' || choice == 'T' ){
            displayReceipt();
            stop = true;
        }
        //or wront item picked
        else{
            cout << choice << " is not a valid choice. Try again\n" << endl;
        }

    }//end while loop


    return 0;
    //end of program
}

Ответы [ 3 ]

1 голос
/ 05 мая 2010

struct item sandwich{"Sandwich", 3.00}; - это использование составного литерала , которое допустимо в C (стандарт C99), но еще не разрешено в C ++. Но поскольку большинство компиляторов C ++ компилируют код как на C, так и на C ++, некоторые решают разрешить такие структуры в C ++. Однако большинство не обходится без специальных аргументов командной строки.

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

struct item {
    item(string const & name_, double price_) : name(name_), price(price_) {}
    string name;
    double price;
};

А теперь вы можете создавать новые предметы с помощью

item sandwich("Sandwich", 3.00);

приписка Обратите внимание, что я бы использовал именованные инициализаторы в составных литералах, когда в одной структуре есть поля с различным значением, просто понять, что к чему, тогда.

struct item sandwich = {.name = "Sandwich", .price = 3.0};

Конечно, это не сработает и в C ++, но, по крайней мере, выглядит лучше.

P.P.S. Оказывается, я не обращал достаточного внимания на C ++ 0x, и там он называется списки инициализаторов . Похоже, что вы не можете сделать это имя, хотя это позор. Таким образом, вместо использования стандарта C99 в коде C ++ ваш компилятор Linux молча использовал экспериментальные стандарты C ++ 0x. Тем не менее, если вам нужен кроссплатформенный код, все же лучше держаться подальше от этих модных функций и использовать вместо этого простые старые конструкторы.

1 голос
/ 05 мая 2010

Вам не хватает оператора присваивания там:

struct item sandwich = {"Sandwich", 3.00};

Обратите внимание, что это синтаксис языка C. Вы, вероятно, хотите сказать

item sandwich("Sandwich", 3.00);

и добавьте к item конструктор, который принимает string и double.

0 голосов
/ 05 мая 2010

Dev-C ++ использует старую версию MinGW-компилятора. При использовании более новой версии gcc из проекта MinGW, которая поддерживает функцию расширенных списков инициализаторов C ++ 0x (в частности, серии gcc 4.4), следует выдавать предупреждение о том, что строки помечены как ошибочные:

testing.cc: 14: предупреждение: расширено списки инициализатора доступны только с -std = c ++ 0x или -std = gnu ++ 0x testing.cc:15: предупреждение: расширено списки инициализатора доступны только с -std = c ++ 0x или -std = gnu ++ 0x testing.cc:16: предупреждение: расширено списки инициализатора доступны только с -std = c ++ 0x или -std = gnu ++ 0x

Моя версия gcc 4.4.3 все равно жаловалась ... Не уверен насчет вашей.

...