C++ 链接错误2019,但原型位于头文件中

C++ 链接错误2019,但原型位于头文件中,c++,lnk2019,unresolved-external,C++,Lnk2019,Unresolved External,我得到了一个带有名称空间的头文件,该名称空间声明了一个结构和一些原型。在definitions.cpp文件中,我有所有函数定义。然后main.cpp文件只创建几个结构,调用一些函数来填充结构,然后调用另一个函数来显示结构 我的问题是它给了我一个未解决的外部错误。据我所知,我认为编译器正在抱怨它找不到main.cpp中调用的函数的原型-重载的setStruct()和showStruct() 但是我想,当我在main.cpp中包含header.h文件并用using声明声明函数时,它让编译器能够访问存

我得到了一个带有名称空间的头文件,该名称空间声明了一个结构和一些原型。在definitions.cpp文件中,我有所有函数定义。然后main.cpp文件只创建几个结构,调用一些函数来填充结构,然后调用另一个函数来显示结构

我的问题是它给了我一个未解决的外部错误。据我所知,我认为编译器正在抱怨它找不到main.cpp中调用的函数的原型-重载的
setStruct()
showStruct()

但是我想,当我在main.cpp中包含header.h文件并用using声明声明函数时,它让编译器能够访问存储在头文件中的原型

标题.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;
}

任何帮助都会很好,谢谢。

当您定义
setSales
etc函数时,您需要告诉编译器它们位于SALES命名空间中。放置

namespace SALES
{

    // functions here
}

将这样做。

您当前正在任何命名空间之外定义函数,这就是链接器无法在声明和识别这些函数的命名空间中找到定义的原因

修复方法是将函数包装在实现文件Definitions.cpp中,命名空间与头文件中的做法类似

如果我是你,我会这样写:

namespace SALES
{
    ...
    void setSales(Sales & s) // fill sales structure interactivly
    ...
        std::cout<<"Average of sales: "<<s.average<<std::endl;
    }
}
名称空间销售
{
...
void setSales(Sales&s)//交互填写销售结构
...
std::coutp的可能副本
namespace SALES
{

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