[c++] "cannot be used as a function error"

I am writing a simple program that uses functions found in different .cpp files. All of my prototypes are contained in a header file. I pass some of the functions into other functions and am not sure if I am doing it correctly. The error I get is "'functionname' cannot be used as a function". The function it says cannot be used is the growthRate function and the estimatedPopulation function. The data comes in through an input function (which I do think is working).

Thanks!

header file:

#ifndef header_h
#define header_h

#include <iostream>
#include <iomanip>
#include <cstdlib>


using namespace std;

//prototypes
void extern input(int&, float&, float&, int&);
float extern growthRate (float, float);
int extern estimatedPopulation (int, float);
void extern output (int);
void extern myLabel(const char *, const char *);

#endif

growthRate function:

 #include "header.h"

float growthRate (float birthRate, float deathRate, float growthrt)     
{    
    growthrt = ((birthRate) - (deathRate))
    return growthrt;   
}

estimatedPopulation function:

    #include "header.h"

int estimatedPopulation (int currentPopulation, float growthrt)
{
    return ((currentPopulation) + (currentPopulation) * (growthrt / 100);
}

main:

#include "header.h"

int main ()
{
    float birthRate, deathRate, growthRate;
    char response; 
    int currentPopulation, years, estimatedPopulation;

    do //main loop
    {  
        input (currentPopulation, birthRate, deathRate, years);
        growthRate (birthRate, deathRate, growthrt);

        estimatedPopulation (currentPopulation, growthrt);
        output (estimatedPopulation (currentPopulation, growthrt));
        cout << "\n Would you like another population estimation? (y,n) ";
        cin >> response;
    }          
    while (response == 'Y' || response == 'y');

    myLabel ("5-19", "12/09/2010");   

    system ("Pause");

    return 0;
}    

This question is related to c++ function

The answer is


Modify your estimated population function to take a growth argument of type float. Then you can call the growthRate function with your birthRate and deathRate and use the return value as the input for grown into estimatedPopulation.

float growthRate (float birthRate, float deathRate)     
{    
    return ((birthRate) - (deathRate));    
}

int estimatedPopulation (int currentPopulation, float growth)
{
    return ((currentPopulation) + (currentPopulation) * (growth / 100);
}

// main.cpp
int currentPopulation = 100;
int births = 50;
int deaths = 25;
int population = estimatedPopulation(currentPopulation, growthRate(births, deaths));

Your compiler is right. You can't use the growthRate variable you declared in main as a function.

Maybe you should pick different names for your variables so they don't override function names?


#include "header.h"

int estimatedPopulation (int currentPopulation, float growthRate)
{
    return currentPopulation + currentPopulation * growthRate  / 100;
}

You can't pass a function as a parameter. Simply remove it from estimatedPopulation() and replace it with 'float growthRate'. use this in your calculation instead of calling the function:

int estimatedPopulation (int currentPopulation, float growthRate)
{
    return (currentPopulation + currentPopulation * growthRate / 100);
}

and call it as:

int foo = estimatedPopulation (currentPopulation, growthRate (birthRate, deathRate));

This line is the problem:

int estimatedPopulation (int currentPopulation,
                         float growthRate (birthRate, deathRate))

Make it:

int estimatedPopulation (int currentPopulation, float birthRate, float deathRate)

instead and invoke the function with three arguments like

estimatePopulation( currentPopulation, birthRate, deathRate );

OR declare it with two arguments like:

int estimatedPopulation (int currentPopulation, float growthrt ) { ... }

and call it as

estimatedPopulation( currentPopulation, growthRate (birthRate, deathRate));

Edit:

Probably more important here - C++ (and C) names have scope. You can have two things named the same but not at the same time. In your particular case your grouthRate variable in the main() hides the function with the same name. So within main() you can only access grouthRate as float. On the other hand, outside of the main() you can only access that name as a function, since that automatic variable is only visible within the scope of main().

Just hope I didn't confuse you further :)