1

さて、私はいくつかのコードを開発しました。

リンケージ(かなり長い)

そして、Clang++ 3.2 でコンパイルすると、実行されて次のようになります。

stdout: 
print: C-3PO
print: R2D2

ただし、G++ 4.7.2 でコンパイルしようとすると、これらのエラーが発生します。

Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:90:71: error: no matching function for call to 'makeRunnable(int (&)(char, int, const char*), char, int)'
source.cpp:90:71: note: candidate is:
source.cpp:74:27: note: template<class ... RUN_TIME, class T, class ... CONSTRUCTION_TIME> Runnable<T, RUN_TIME ...>* makeRunnable(T (*)(CONSTRUCTION_TIME ..., RUN_TIME ...), CONSTRUCTION_TIME ...)
source.cpp:74:27: note:   template argument deduction/substitution failed:
source.cpp:90:71: note:   mismatched types 'const char*' and 'char'
source.cpp:90:71: error: unable to deduce 'auto' from '<expression error>'
source.cpp:92:72: error: no matching function for call to 'makeRunnable(int (&)(char, int, const char*), char)'
source.cpp:92:72: note: candidate is:
source.cpp:74:27: note: template<class ... RUN_TIME, class T, class ... CONSTRUCTION_TIME> Runnable<T, RUN_TIME ...>* makeRunnable(T (*)(CONSTRUCTION_TIME ..., RUN_TIME ...), CONSTRUCTION_TIME ...)
source.cpp:74:27: note:   template argument deduction/substitution failed:
source.cpp:92:72: note:   mismatched types 'int' and 'char'
source.cpp:92:72: error: unable to deduce 'auto' from '<expression error>'

そして、G++ 4.8.0 とほぼ同じです (ただし、よりきれいにフォーマットされています)。

問題は次のとおりです。

このコードは規格に準拠していますか? - そうでなければ、なぜですか?

リンクから関連するコードを編集:

template<typename... RUN_TIME, typename T, typename... CONSTRUCTION_TIME> 
Runnable<T, RUN_TIME...>* makeRunnable(T (*FunctionType)(CONSTRUCTION_TIME..., RUN_TIME...), CONSTRUCTION_TIME... ct_args)  // Line 74
{
    return new FunctionDelegate<T,
                                std::tuple<CONSTRUCTION_TIME...>,
                                std::tuple<CONSTRUCTION_TIME..., RUN_TIME...>,
                                RUN_TIME...>(FunctionType, std::make_tuple(ct_args...));
}

int print_function(char arg1, int arg2, const char* arg3)
{
    std::cout << "print: " << arg1 << arg2 << arg3 << std::endl;
    return 2;
}

int main()
{   
    auto function1 = makeRunnable<const char*>(print_function, 'C', -3);  // Line 90
    int n = function1->invoke("PO");
    auto function2 = makeRunnable<int, const char*>(print_function, 'R');  // Line 92
    function2->invoke(n, "D2");
}

この質問のポイントは、問題の実装ではなく、Clang++ と G++ がこれがエラーかどうかについて意見が分かれていないことです。

4

1 に答える 1

1

コードを少し試してみましたが、g ++は可変個引数テンプレートの連結(の間|!|)の推定を処理できないようです。

Runnable<T, RUN_TIME...>* makeRunnable(T (*FunctionType)|!|(CONSTRUCTION_TIME..., RUN_TIME...)|!|, CONSTRUCTION_TIME... ct_args)

また、g ++がテンプレートを直接推測できるように、別の可変個引数テンプレート引数を追加することで、コードを修正できます。

于 2013-03-07T13:46:23.123 に答える