2011-04-12 10 views
2

誰かがコンパイラは2例を以下に何異なる私に言うことはできますか?は、戻り値の型に機能をオーバーロード? (再訪)

#include <cstdio> 
    using namespace std; 

    template <typename TReturn, typename T> 
    TReturn convert(T x) 
    { 
     return x; 
    } 

    int main() 
    { 

     printf("Convert : %d %c\n", convert<int, double>(19.23), convert<char, double>(100)); 
     return 0; 
    } 

int convert(double x) 
{ 
    return 100; 
} 

char convert(double x) 
{ 
    return 'x'; 
}   

int main() 
{ 
    printf("Convert : %d %c\n", convert(19.23), convert(100));  // this doesn't compile 
    return 0; 
} 

最初のケースは、関数のオーバーロードを持っていませんか?コンパイラは、テンプレート関数にこの呼び出しを検出すると

+8

無効であなたの第二ケース。コンパイルする唯一の理由は、 'convert'ではなく' covert'をタイプしたからです。同じ名前の2つの関数を宣言することはできません。戻り値の型だけが異なります。 –

答えて

7

、それは(この場合、倍)を自動的に実際のテンプレートパラメータとして渡されたタイプによって各外観を交換する機能を生成するためにテンプレートを使用し、それを呼び出します。このプロセスは自動的にコンパイラによって実行され、プログラマには見えません。したがって、データ抽象化と隠蔽も実装されます。

コンパイラは、通常の関数やクラスなどのテンプレートを扱いません。それらはrequireでコンパイルされます。つまり、テンプレート関数のコードは必要になるまでコンパイルされません。

第二exmapleオーバーロードされていません。変換が間違っています。