Ошибка ссылки 2019, хотя прототипы находятся в заголовочном файле

Я новичок в С++ и просто пытался задать вопрос, включающий 3 файла.

Я получил заголовочный файл с пространством имен, в котором объявляется структура и некоторые прототипы. В файле определения.cpp у меня есть все определения функций. Затем файл main.cpp просто создает несколько структур, вызывает некоторые функции для заполнения структур, а затем вызывает другую функцию для отображения структур.

У меня проблема в том, что это дает мне неразрешенную внешнюю ошибку. Из того, что я могу собрать, я думаю, что компилятор жалуется, что не может найти прототипы функций, вызываемых в main.cpp - перегруженные setStruct() и showStruct().

Но я думал, что когда я включил файл header.h и объявил функции с использованием объявления в main.cpp, это дало компилятору доступ к прототипам, хранящимся в файле заголовка?

Заголовок.h

#ifndef header_h
#define header_h

namespace SALES
{
    const int QUARTERS = 4;

    struct Sales
    {
        double sales[QUARTERS];
        double average;
        double max;
        double min;
    };
    void setSales(Sales & s, const double ar[], int n);
    void setSales(Sales & s);
    void showSales(const Sales & s);
}

#endif

Определения.cpp

#include<iostream>
#include"header.h"
using SALES::Sales;
using SALES::QUARTERS;


double max(Sales & s) //find max sale value in sales array
{
    double maxVal = s.sales[0];
    for(int i = 1; i<4;i++)
    {
        if(s.sales[i]>maxVal)
        {
            maxVal = s.sales[i];  
        }

    }
    return maxVal;
}

double min(Sales & s) //find min sale value in sales array
{
    double minVal = s.sales[0];
    for(int i = 1; i<4;i++)
    {
        if(s.sales[i]<minVal)
        {
            minVal = s.sales[i];  
        }

    }
    return minVal;
}

void setSales(Sales & s) // fill sales structure interactivly
{
    std::cout<< "Please enter the sales for the yearly quarters.\n";
    for(int i = 0;i<QUARTERS;i++)
    {
        std::cout<< "Quater "<<i+1<<": ";
        while(!(std::cin>>s.sales[i]))
        {
            std::cout<<"Please enter valid input\n";
            std::cout<< "Quater "<<i+1<<": ";
            std::cin.clear();
            std::cin.ignore();
        }

    }
    s.average = ((s.sales[0]+s.sales[1]+s.sales[2]+s.sales[3])/4); 
    s.max = max(s);
    s.min = min(s);

}


void setSales(Sales & s, const double ar[], int n) // fill sales structure non interactivly
{
    for(int i = 0;i<n;i++)
    {
        s.sales[i] = ar[i];
    }
    for(int i = n;i<QUARTERS;i++)
    {
        s.sales[i] = 0;
    }
    s.average = ((s.sales[0]+s.sales[1]+s.sales[2]+s.sales[3])/4); 
    s.max = max(s);
    s.min = min(s);


}

void showSales(const Sales & s) // display structure
{
    std::cout<< "\nSales for the year\n";
    for(int i = 0;i<QUARTERS;i++)
    {
        std::cout<<"Quarter "<<i+1<<": $"<<s.sales[i];
    }
    std::cout<<"Max Sale: "<<s.max<<std::endl;
    std::cout<<"Min Sale: "<<s.min<<std::endl;
    std::cout<<"Average of sales: "<<s.average<<std::endl;
}

Main.cpp

#include<iostream>
#include"header.h"

using SALES::Sales;
using SALES::setSales;
using SALES::showSales;

int main()
{
    double Sales1[4] = {453.50, 654.60, 340.20, 500.30};

    Sales Year1;
    Sales Year2;

    setSales(Year1, Sales1, 3);
    setSales(Year2);

    showSales(Year1);
    showSales(Year2);

    return 0;
}

Ошибка

1>------ Build started: Project: Myfirst, Configuration: Debug Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &,double const * const,int)" (?setSales@SALES@@YAXAAUSales@1@QBNH@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &)" (?setSales@SALES@@YAXAAUSales@1@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::showSales(struct SALES::Sales const &)" (?showSales@SALES@@YAXABUSales@1@@Z) referenced in function _main
1>E:\Documents\Uni\Programming\C++ starter projects\Myfirst\Debug\Myfirst.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Любая помощь будет здорово, спасибо.


person user3453972    schedule 09.04.2014    source источник


Ответы (2)


Когда вы определяете функции setSales etc, вам нужно сообщить компилятору, что они находятся в пространстве имен SALES. положить

namespace SALES
{

    // functions here
}

сделаю это.

person The Dark    schedule 09.04.2014

В настоящее время вы определяете свои функции вне какого-либо пространства имен, и это причина того, что компоновщик не находит определения в пространстве имен, где эти функции объявлены и распознаны.

Исправление будет состоять в том, чтобы обернуть функции в ваш файл реализации — Definitions.cpp — с пространством имен, аналогичным тому, как вы делаете это в файле заголовка.

Вот что я бы написал на вашем месте:

namespace SALES
{
    ...
    void setSales(Sales & s) // fill sales structure interactivly
    ...
        std::cout<<"Average of sales: "<<s.average<<std::endl;
    }
}

Если вы не поместите остальное (ваш min и max) в пространство имен, используйте спецификатор области видимости :: на всякий случай, хотя я бы предложил поместить все в свое собственное пространство имен.

person lpapp    schedule 09.04.2014