模板函数不是命名空间的成员

时间:2015-12-01 17:51:45

标签: c++ templates

我有一个头文件RandFunctions.hpp,其中包含模板函数

#ifndef _RANDFUNCTIONS_HPP_
#define _RANDFUNCTIONS_HPP_
#include <stdlib.h>
#include <time.h>

namespace surena
{
  namespace common
  {

template<typename RealT> inline
RealT
RealRandom()
{
  return rand()/(RealT(RAND_MAX)+1);
}  

  };
};
#endif

另一个标题文件Search.hpp,其中包含RandFunctions.hpp

#ifndef _SEARCH_HPP_
#define _SEARCH_HPP_

#include "RandFunctions.hpp"

#include <stdlib.h>
#include <time.h>

namespace surena
{
  namespace search
  {

template<typename RealT>
class CTest
{
  public:
    CTest() {srand((unsigned)(time(0)));}

    RealT
    GenRand(){ return common::RealRandom(); }
};

  };
};
#endif

当我将Search.hpp包含在cpp文件中时,例如,

#include "Search.hpp"

int
main(int argc, char** argv)
{
  CTest<float> test;
  return(0);
}

我收到以下编译时错误:

‘RealRandom’ is not a member of ‘surena::common’

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

由于RealRandom是没有参数的模板函数,因此需要提供模板参数:

GenRand(){ return common::RealRandom<RealT>(); }
                                    ^^^^^^^

同样在您的主要内容中,您必须使用正确的命名空间限定test变量:

surena::search::CTest<float> test;
^^^^^^^^^^^^^^^^