2009-06-26 3 views
1

私は、文字列入力に基づいて適切なルーチンを実行するために一連のフィルタ関数を使用しようとしていました。テンプレートを使用して一般的なケースのためのマッチャー関数を作成しようとしましたが、実際のアプリケーションの構造内で特殊な関数へのポインターを格納しようとすると "タイプがタイプに一致しません"というエラーが発生しました文字列に特化したテンプレート関数へのポインタを取る方法は?

Distilled例のVisual C++ 8 'コンソールアプリケーションの

template <const char *C> 
const char* 
f(void) { 
    return C; 
} 

const char* (*g)(void) = f<"hi">; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return g(); 
} 

からこれはエラー

Error 1 error C2440: 'initializing' : cannot convert from 'const char *(__cdecl *)(void)' to 'const char *(__cdecl *)(void)' c:\files\pointer.cpp 7 

で失敗し(それはまた、メインの戻り値の誤差を持っているが、それはここで私には関係しません。 )

const char *がintに置き換えられた場合、同じ例が続きます。

+0

char gs [] = "hi";を実行するとコンパイルできることが分かりますか? const char *(* g)(void)= f ; –

+0

名前付き変数の使用に関する参照が見つかりましたが、それは私が行っている簡潔なテーブルを破壊します。文字列をテーブルに追加して関数に渡す方がよいでしょう。実際には、私はちょうどパントし、if/elseチェーンを使用しました。 –

答えて

2

テンプレート値パラメーターとしての文字列は、ISO標準で禁止されています。

+0

追加情報:テンプレート値パラメータは、組み込みの整数型でなければなりません。 – rlbond

+0

それは臭いです。エラーメッセージもそうです^) –

+1

@Mr。 Bond:しかし、ポインタは整数型です。文字列リテラルの問題は、異なるコンパイル単位にある2つの同等の文字列が異なるアドレスを持ち、2つの異なるテンプレートのインスタンス化を作成することです。 – eduffy

関連する問題