定义命名空间范围函数

时间:2017-03-13 23:16:05

标签: c++ linker namespaces

我想在命名空间范围内定义公共函数(不在Class中 - 这可行) 基本上我想使用它,例如:

std::chrono::milliseconds(16)

我尝试了很多设置,但这是最近的设置:

TimeX.h

#ifndef TIMEX_H
#define TIMEX_H

namespace timee{

    int now(int z);

}

#endif

TimeX.cpp

#include <chrono>
#include "TimeX.h"
using namespace timee;

int now(int z){return 4;}

Main.cpp的

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

using namespace timee;

int main(int argc, char** argv){
    long c = now(2);
    std::cout << "c" << c <<std::endl;    
    return 0;
}

这给了我以下错误:

  

Main.obj:错误LNK2019:未解析的外部符号&#34; int __cdecl timee :: now(int)&#34; (?now @ timee @@ YAHH @ Z)在函数_SDL_main

中引用

这有什么问题?这令人困惑。为什么链接器告诉我_SDL_main引用了这个?我使用SDL库,但它与我的功能有什么关系?

与此代码相关的第二个问题。

另外还有一个问题(如果不容易回答我会开始新话题)。我使用timee作为名称空间名称,因为我已经错误地告诉time名称已在某处使用Error C2757。我猜它可能嵌套在某个地方。如何找出它的使用位置,是否可以使用该名称?我无法想象编译器在弄清楚我想要使用什么时遇到问题。

1 个答案:

答案 0 :(得分:1)

您必须定义类似

的功能
int timee::now(int z){return 4;} 

或者你可以用这种方式写作

#include <chrono>
#include "TimeX.h"

namespace timee
{
    int now(int z){return 4;}
}

否则在cpp模块中,在全局命名空间中声明(并定义)另一个具有相同名称的函数

#include <chrono>
#include "TimeX.h"
using namespace timee;

int now(int z){return 4;}

这就是这两个定义

int timee::now(int z){return 4;} 
int now(int z){return 4;}

定义不同的功能。第一个声明(并定义)命名空间timee中的函数,而第二个声明(并定义)另一个在全局命名空间中具有相同名称的函数。

对于名称time,它在全局命名空间中定义,并对应于C标准函数time。例如,标题<chrono>可以包含标题<time.h>的标题time