2

私はいくつかのC++11機能を発見していて、問題があります。メンバー関数「呼び出し」があります

class cscript
{
public:
template <typename ret_t, typename... params>
    bool call(ret_t &ret, const char * name, params... parameters);
....

実装:

template <typename ret_t, typename... params>
bool cscript::call(ret_t &ret, const char * name, params... parameters)
{
    ret_t (*func)(params...);
    func = (decltype(func)) tcc_get_symbol(tcc, name);
    if (!func)
        return true;

    ret = func(parameters...);

    return false;
}

リンクすると、次のエラーが表示されます。

obj\Release\main.o:main.cpp:(.text.startup+0xcc)||undefined reference to `bool cscript::call<int, int, int>(int&, char const*, int, int)'|

呼び出し例:

script.call(ret, "sum", 2, 3);

これを機能させる方法について何か提案はありますか?

4

1 に答える 1

5

見た目からすると、テンプレート定義は使用時に表示されません。つまり、コンパイラは、の実装を確認するときに渡す必要のあるテンプレートパラメータを認識しcscript::call()ておらず、使用されているときに実装がどのように見えるかを認識していません。2つの基本的なオプションがあります。

  1. の定義をcscript::call()ヘッダーに入れて、使用時に常に表示されるようにします。
  2. 使用している`csscript:: call()のバージョンを明示的にインスタンス化します。

後者は、実装ファイルの定義の後のどこかで、次のようになります。

template bool cscript::call<int, int, int>(int&, char const*, int, int);

その見た目から、このテンプレートのいくつかの異なるバージョンを使用したいと思うでしょう、そしておそらくあなたは物事を繰り返したくないでしょう。したがって、定義をヘッダーに入れたい可能性があります。

于 2012-08-21T00:17:49.213 に答える