次のサンプルコードがあります。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
それがコードでこの場合
こんにちは@ROX、 私は、関数への入力パラメータを削除したとテンプレートパラメータがCOLORS一定であれば、それは正常に動作します。しかし、私はまた、COLORS変数を取ることができるようにする必要があります。 'COLORS red = RED; whatColor(); ' 私が赤をconstにすると、コンパイラは型を推論するのに十分スマートであるように見えます。しかし、それがconstでなければコンパイルされません。このエラーは、 src/tmplです。cpp:41:2:エラー: 'whatColor'への呼び出しに一致する関数がありません。 whatColor (); src/tmpl.cpp:15:26:メモ:候補テンプレートは無視されます。明示的に指定されていない... –
TheBadCat
C++テンプレートには、コンパイル時に固定される型または値が必要です。ランタイム変数を使用する場合は、テンプレートパラメータとして使用することはできません。 (実際に上記のswitch文の例の中で、各色を扱うためにテンプレートを使用したい場合)。私は今あなたのエラーメッセージは、固定されていない値ではなく、色として固定されているタイプによってテンプレートパラメータを一致させようとしているからです。 – ROX