2016-11-08 6 views
0

次のサンプルコードがあります。Linuxでclangとg ++を使用してコンパイルできない理由を理解してもらえますか?C++テンプレート関数の解像度

#include <iostream> 

using namespace std; 

typedef enum COLORS { 
    RED = 0, 
    GREEN, 
    BLUE, 
    ORANGE, 
    MAROON, 
    WHITE, 
    BLACK 
} COLORS; 

template <COLORS C> void whatColor(COLORS x) { 
    cout << "this can be any color!!!" << endl; 
} 

template<> void whatColor<RED>(COLORS x) { 
    cout << "this is RED!!!" << endl; 
} 

template<> void whatColor<GREEN>(COLORS x) { 
    cout << "this is GREEN!!!" << endl; 
} 

template<> void whatColor<BLUE>(COLORS x) { 
    cout << "this is BLUE!!!" << endl; 
} 

template<> void whatColor<ORANGE>(COLORS x) { 
    cout << "this is ORANGE!!!" << endl; 
} 

int main() { 
    const COLORS red=RED; 

    whatColor(red); 
    whatColor<RED>(RED); 
    whatColor<red>(red); 
    whatColor<RED>(red); 
} 

私は見てい障害はこれです:

CXX [misc] tmpl.cpp 
src/tmpl.cpp:40:2: error: no matching function for call to 'whatColor' 
    whatColor(red); 
    ^~~~~~~~~ 
src/tmpl.cpp:15:26: note: candidate template ignored: couldn't infer template argument 'C' 
template <COLORS C> void whatColor(COLORS x) { 
        ^
1 error generated. 
make: *** [obj/tmpl.o] Error 1 

それがコードでこの場合

答えて

0

に引数の型を推論できない理由それは私には不明である:

template <COLORS C> void whatColor(COLORS x){...} 

テンプレート関数を定義し、Color型の値Cをテンプレートにして、この関数も同時に偶然起こりますあなたはあなたが提供している

whatColor(red); 

を呼び出すときkeが(実際に使用されていない)をパラメータとしてカラーX

また、その後

C.

のいくつかの可能な値についてはその機能を特化Color xの値はCの値ではありません.XとCは関連していないので(たとえ両方とも色になっても)、コンパイラはCのどの値を使用するかを決める方法はありません。

あなたは色があなたのコードは、それが現在することは可能であろう例えば両方

のミックスをしようとした瞬間に(それはコンパイル時に固定またはされていない)、動的または静的に型付けになりたいかどうかを決定する必要がありこのように呼び出す

whatColor<RED>(BLUE); 

これは本当に少し奇妙です。 C = RED、X = BLUE(ただし、Xは無視されます)

あなたはコンパイル時に色を修正したい場合は、Xの機能パラメータを削除し、ちょうど

template <COLORS C> void whatColor() //definition 
whatColor<RED>(); // call 

た場合、またはCのテンプレートパラメータを使用することができますあなたは私はどちらか推薦してること(異なる色は、異なるタイプだったのではなく値が、その後のオーバーロードやテンプレートコードならば、テンプレート

void whatColor(COLORS X) 
{ 
    // maybe use a switch statement on X 
} 

を使用しない、Xパラメータを使用する機能が働くだろうではないしたいですこれ)

class Red{}; 
class Blue{}; 
template <typename COLORSTYPE> void whatColor(COLORSTYPE x) 
{ 
    // ... 
} 

//または過負荷

void whatColor(Red dummy){//...} 
void whatColor(Blue dummy){//...} 

Red red; 
whatColor(red); 
+0

こんにちは@ROX、 私は、関数への入力パラメータを削除したとテンプレートパラメータがCOLORS一定であれば、それは正常に動作します。しかし、私はまた、COLORS変数を取ることができるようにする必要があります。 'COLORS red = RED; whatColor (); ' 私が赤をconstにすると、コンパイラは型を推論するのに十分スマートであるように見えます。しかし、それがconstでなければコンパイルされません。このエラーは、 src/tmplです。cpp:41:2:エラー: 'whatColor'への呼び出しに一致する関数がありません。 whatColor (); src/tmpl.cpp:15:26:メモ:候補テンプレートは無視されます。明示的に指定されていない... – TheBadCat

+0

C++テンプレートには、コンパイル時に固定される型または値が必要です。ランタイム変数を使用する場合は、テンプレートパラメータとして使用することはできません。 (実際に上記のswitch文の例の中で、各色を扱うためにテンプレートを使用したい場合)。私は今あなたのエラーメッセージは、固定されていない値ではなく、色として固定されているタイプによってテンプレートパラメータを一致させようとしているからです。 – ROX

関連する問題