2012-03-04 9 views
2

私は特別な処理とラッピングを使用して、さまざまなタイプをリストに追加するために使用しているクラスのテンプレートメンバー関数を持っていますstd :: stringとchar []の両方の引数を扱う特殊なテンプレートメンバー関数

template<typename V> const var& addvar(const V& v); 

template<> const var& addvar<std::string>(const std::string& v) {/*stuff*/} 

しかし、私はそれには、このような文字列(まあ、constのchar配列)の周りに渡している:

object.addvar("lol"); 

私は取り扱いしていますが、特定のタイプの)VaRのオブジェクトにラップアップstd :: stringsとしてのすべてのもの、これはconst char配列参照の何らかの並べ替えとしてポップインしますテンプレート・パラメータ・タイプの控除に適用されます。だから私は、上記のstd :: stringの特殊化でさえも、そのための関数を持たないことについてのエラーを得る。私は、テンプレート配列サイズ控除に精通してるので、私はそのようなことを扱うことができるaddvarを作成するために、そのフォーマットを使用しようとしている、のようなもの:

template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/} 

しかし、物事は違法程度コンパイルエラーと恐ろしくうとしています参照配列。これはVC++ 2010にあります。それには何らかの不思議さがありますが、私はここで何か根本的なものを台無しにしていると感じています。

答えて

4

それが過負荷(初期addvarテンプレート関数では何も共有していない=テンプレート)である必要がありますので、あなたは部分的に、テンプレート関数を特化することはできません。機能は次のようになり

template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/} 
+0

ああ、私はaddvar でそれを試してみましたが、うまくいかなかったのですが、の方法でうまく動作します。ありがとう! – user173342

1
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/} 
                ^

const char&を削除し、あなたが望むものではありません(どちらか違法な方法である)そのように参照の配列のために特化しようとしています。

+0

これは私に「明示的なテンプレート引数を不正に使用する」というエラーを表示します。 – user173342

1

これは:

template <std::size_t N> 
void foo(const char (&a)[N]) 

しかし、あなたの問題は、部分的に関数を特殊化することができないということです。しかし、あなたができることは、簡単なオーバーロードを定義することです。これはコンパイラから優先されて呼び出されます。

関連する問題