2009-07-17 16 views
6

テンプレート関数を呼び出すときに、関数名の後に型を省略しても問題ありませんか?C++テンプレートでの引数の省略

例として、機能を考慮

テンプレート<typename T>ボイドF(TのVAR){...}。

は、それは単に、このようにそれを呼び出すために、OKです:

int型のx = 5;
f(x);

またはは、タイプを含めるとですか?

int x = 5; (x);

+3

あなたはそれを試してみて、何が起こるかを見ることができませんでしたか?テストするのに十分なほど簡単です。 –

+6

@ Ed Swangren、「ちょうど試してみる」方法は非常に情報がない。せいぜい、特定のコンパイラが与えられた構文を可能にすることを伝えます。これは、言語標準に関する文の意味または正確さについては何も教えてくれません。 – Trent

+0

私は質問を明確にすることができたと思います。トレントが親切に指摘したように、これがコンパイルされるかどうかはあまりありませんでした。私は舞台裏で何が起こっているのか不思議で、そこに良い情報を見つけるのは難しいです! – Chris

答えて

17

コンパイラが関数の引数からテンプレートの引数を推論できるときはいつでも、それらを残すことができます。これはコードを読みやすくするための良い習慣です。

また、あなただけではない始めや途中、最後のテンプレート引数を残すことができます:

template<typename T, typename U> void f(T t) {} 
template<typename T, typename U> void g(U u) {} 

int main() { 
    f<int>(5);  // NOT LEGAL 
    f<int, int>(5); // LEGAL 

    g<int>(5);  // LEGAL 
    g<int, int>(5); // LEGAL 

    return 0; 
} 
10

暗黙のテンプレートパラメータを使用して呼び出すときに問題はありません。コンパイラは混乱しているかどうかを知らせます。この場合、関数を呼び出すためのテンプレートパラメータを明示的に定義する必要があります。

+1

この回答は理にかなっていません。あなたは常に関数を明示的に呼び出します... – Zifre

+1

Zifre、私は彼が "関数呼び出しでテンプレートパラメータを明示的にインクルードする必要があるかもしれない"という意味だと思います。 – aem

+1

関数を明示的にまたは暗黙的に呼び出すことに関して、私は明示的にテンプレートパラメータを定義することについて話しません... – DeusAduro

関連する問題