4

次のように定義された可変個引数テンプレートメンバー関数があります。

template<typename ... Params>
 VAlgorithm* CreateAlgorithm(const char *objectName, const char *className, Params ... par)

そして、Paramsにタイプが含まれていない特殊バージョン(私は「空の」特殊化と呼んでいます)、つまり次のアドレスを取得したいと思います。

VAlgorithm* CreateAlgorithm(const char *objectName, const char *className)

私はいくつかの方法で試しました。素朴な方法:

&AlgorithmFactory::CreateAlgorithm<>

(たとえば、&AlgorithmFactory :: CreateAlgorithm <int>が機能するため)、より明示的な方法:

(VAlgorithm* (*)(const char*, const char*))AlgorithmFactory::CreateAlgorithm<>

明示的な方法で、GCC4.7.1は次のように述べています。

error: insufficient contextual information to determine type

「空の」特殊化はコンパイラーによって理解されていないようです。コンパイラーは、欠落しているテンプレートタイプを、「タイプなし」の情報ではなく、情報の欠如として解釈します。これを行う正しい方法は何ですか?(潜在的に素朴な質問で申し訳ありませんが、私は可変個引数テンプレートにかなり慣れておらず、このトピックに関するドキュメントは見つかりませんでした)。ありがとう

4

1 に答える 1

1

コードは機能するはずです。たとえば、 http: //liveworkspace.org/code/6253cf45f416be60879b93aa74c24de8を参照してください。

次のすべての構文が私のために機能します:

struct S {
  template<typename... Args> static int *foo(const char *, const char *, Args...);
};

int main() {
    (int *(*)(const char *, const char *))S::foo<>;
    (int *(*)(const char *, const char *))S::foo;
    (int *(&)(const char *, const char *))S::foo<>;
    (int *(&)(const char *, const char *))S::foo;
    int *(&f)(const char *, const char *) = S::foo<>;
    int *(&g)(const char *, const char *) = S::foo;
    int *(*h)(const char *, const char *) = S::foo<>;
    int *(*i)(const char *, const char *) = S::foo;
}
于 2012-09-03T14:32:57.183 に答える