2012-04-09 61 views
3

說我有一個模板函數名稱空間答:我也有另外一個名字空間B.有一個在命名空間中聲明的模板函數,它被定義爲用的typedef模板函數

template<typename T, typename U> 
void f(T a, U b); 

現在,在命名空間B,我想要聲明一個特殊類型的模板函數。我在想,如果因此被命名空間乙聲明爲

void f(int a, double b); 

沒有實際執行函數調用模板功能,我可以typedef模板功能。由於有一種方法可以用特定的模板參數聲明新的類型名稱,不應該有一種方法可以用函數來做到這一點嗎? 我嘗試了不同的方法來實現它,但它並沒有完全解決。

那麼C++中是否已經有一種方法可以在不實際實現新函數的情況下使用給定的模板參數重新聲明函數?如果不是,它在C++ 11中可以實現嗎?

這將是一個實用的功能有,因爲它將使該功能的目的更加清晰,會更好的語法:)

編輯:因此,人們可以這樣寫:

using A::f<int, double>; 
B中

命名空間和功能會顯示這些模板參數

+0

一眼後,這是否幫助? http://www2.research.att.com/~bs/C++0xFAQ.html#template-alias – chris 2012-04-09 18:56:09

+0

不太確定,因爲它似乎目前的版本的Visual c + +不支持使用語法(? )。至少對我來說,它只是輸出了大量的語法錯誤 – weggo 2012-04-10 07:03:04

+0

編譯器也必須支持該功能。我認爲GCC還沒有。 – chris 2012-04-10 11:22:07

回答

5

您可以使用using

namespace A { 
    template <typename T> void f(T); 
    template <> void f<int>(int); // specialization 
} 

namespace B { 
    using ::A::f; 
} 

你不能區分專業那樣(因爲using只是約名稱),但它應該足以使所需的專業化可見。

2

你可以用一個內聯函數:

namespace A 
{ 
    template<typename T, typename U> 
    void f(T a, U b); 
}; 

namespace B 
{ 
    inline void f(int a, double b) { A::f(a,b); } 
}; 

看到這個問題:

C++11: How to alias a function?