为什么在使用命名空间时需要c ++命名空间说明符?

时间:2016-04-22 18:23:23

标签: c++ namespaces

以下类ADate声明由命名空间A
括起来 .h文件

#ifndef ADATE_H
#define ADATE_H

namespace A{

    class ADate
    {
    public:
        static unsigned int daysInMonth[];

    private:
        int day;
        int month;
        int year;

    public:
        ADate(const unsigned int day, const unsigned int month, const unsigned int year);
    };

    bool isValidDate(const unsigned int day, const unsigned int month, const unsigned int year);
}


#endif // ADATE_H

.cpp文件:

#include "adate.h"

using namespace A;

unsigned int ADate::daysInMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

ADate::ADate(const unsigned int day, const unsigned int month, const unsigned int year) :
    day{day},
    month{month},
    year{year}
{
    if(!isValidDate(day,month,year)){
        throw string{"invalid Date"};
    }
}

bool isValidDate(const unsigned int day, const unsigned int month, const unsigned int year)
{
    if(month < 1 || month > 12){
        return false;
    }
    if(day < 1 || day > ADate::daysInMonth[month-1]){
        return false;
    }
    if(year < 1979 || year > 2038){
        return false;
    }
    return true;
}

应该认为上面的代码可以成功编译。但是,这不是那种方式,导致对'A :: isValidDate(unsigned int,unsigned int,unsigned int)&#39;的未定义引用。发生。

我不明白为什么我必须使用命名空间说明符作为全局函数&#39; isValidDate&#39;的前缀。

你能解释一下原因吗? 谢谢

1 个答案:

答案 0 :(得分:1)

由于命名空间查找规则。

请参阅:http://en.cppreference.com/w/cpp/language/lookup

对于变量,名称空间,类等(除了函数),名称查找必须生成一个声明才能使程序编译。

对于函数名称查找可以关联多个声明(然后通过参数比较解析)。

所以:

bool isValidDate(const unsigned int day, const unsigned int month, const unsigned int year)
{
   // CODE
}

既是声明又是定义。命名空间解析不需要将函数的名称解析为A::isValidDate()函数,因此它不需要。相反,它会在isValidDate()的当前范围中添加另一个声明。