2015-12-01 70 views
0

我有一個頭文件,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’ 

這裏有什麼問題?

+0

使用編譯器[具有更好的診斷消息](http://ideone.com/ENZpBQ)。 –

回答

1

由於RealRandom是不帶參數的模板功能,你需要提供一個模板參數:

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

而且在你的主,你就必須用正確的命名空間限定的test變量:

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

現在,我得到了兩個額外的錯誤:'預期主要表達'之前>'令牌'和'預期主要表達'之前')'令牌 – Rasoul

+0

@Rasoul看看我的更新。 – 101010