2013-11-01 459 views
1

使用GNU編譯器,我發現了錯誤錯誤:太少模板參數列表

error: too few template-parameter-lists 

這讓我困惑,因爲英特爾編譯器似乎處理這個下面的代碼段沒有這麼多的倍數警告:

// Template to retrieve traits of any MPI object 
template <class T> 
struct mpi_type_traits { 
    typedef T element_type; 
    typedef T* element_addr_type; 
    static inline MPI_Datatype get_type(T&& val); 
    static inline size_t get_size(T& val); 
    static inline void* get_addr(T& val); 
}; 

// Specialization of mpi_type_traits for primitive types 
#define PRIMITIVE(Type, MpiType) \ 
     template<> \ 
     inline MPI_Datatype mpi_type_traits<Type>::get_type(Type&&) { return MpiType; } \ 
     inline size_t mpi_type_traits<Type>::get_size(Type&) { return 1; } \ 
     inline void* mpi_type_traits<Type>::get_addr(Type& val) { return &val; } 
    PRIMITIVE(char, MPI::CHAR); 
    PRIMITIVE(wchar_t, MPI::WCHAR); 
    PRIMITIVE(short, MPI::SHORT); 
    PRIMITIVE(int, MPI::INT); 
    PRIMITIVE(long, MPI::LONG); 
    PRIMITIVE(signed char, MPI::SIGNED_CHAR); 
    PRIMITIVE(unsigned char, MPI::UNSIGNED_CHAR); 
    PRIMITIVE(unsigned short, MPI::UNSIGNED_SHORT); 
    PRIMITIVE(unsigned int, MPI::UNSIGNED); 
    PRIMITIVE(unsigned long, MPI::UNSIGNED_LONG); 
    PRIMITIVE(unsigned long long, MPI::UNSIGNED_LONG_LONG); 
    PRIMITIVE(bool, MPI::BOOL); 
    PRIMITIVE(std::complex<float>, MPI::COMPLEX); 
    PRIMITIVE(std::complex<double>, MPI::DOUBLE_COMPLEX); 
    PRIMITIVE(std::complex<long double>, MPI::LONG_DOUBLE_COMPLEX); 

#undef PRIMITIVE 

從閱讀周圍,這有什麼做的類型名稱規範,但我不能完全精確定位需要的地方放置。很顯然,每個PRIMITIVE都會產生錯誤。

回答

2

好吧,算了一下。需要在每個定義的內聯之前放置模板<>。

... 
#define PRIMITIVE(Type, MpiType) \ 
    template<> \ 
    inline MPI_Datatype mpi_type_traits<Type>::get_type(Type&&) { return MpiType; } \ 
    template<> \ 
    inline size_t mpi_type_traits<Type>::get_size(Type&) { return 1; } \ 
    template<> \ 
    inline void* mpi_type_traits<Type>::get_addr(Type& val) { return &val; } 
    PRIMITIVE(char, MPI::CHAR); 
...