1

私は、.dllまたは.soまたは同等のものを動的にロードするように設計されたクラスを持っています。そこから、あなたが探している機能にポインタを返します。残念ながら、実装には2つの問題があります。バリデリックテンプレートを使用した「コールに一致する関数がありません」

  1. 私は関数へのポインタとして* voidを返す「ダム」関数を使用している場合は、私は私が使用できる形式にそれらを操作しようとすると、私はwarning: ISO C++ forbids casting between pointer-to-function and pointer-to-objectを取得します。
  2. バリデーションテンプレートとタイプセーフティで「スマート」機能を使用しようとすると、コンパイルできません。 error: no matching function for call to ‘Library::findFunction(std::string&)’はここで私を待っている唯一のものです。以下のコードからわかるように、これは関数のシグネチャと一致する必要があります。それがコンパイルされると、issue 1もここに存在します。

参考として、私はUbuntu 10.10 x86_64の下にg++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5でコンパイルしています。私もg++-4.5 (Ubuntu/Linaro 4.5.1-7ubuntu2) 4.5.1でコンパイルしようとしましたが、これは何も変わりません。

#include <string> 
#include <stdio.h> 

class Library 
{ 
public: 
    Library(const std::string& path) {} 
    ~Library() {} 

    void* findFunction(const std::string& funcName) const 
    { 
     // dlsym will return a void* as pointer-to-function here. 
     return 0; 
    } 

    template<typename RetType, typename... T> 
    RetType (*findFunction(const std::string& funcName))(T... Ts) const 
    { 
     return (RetType (*)(...))findFunction(funcName); 
    } 

}; 

int main() 
{ 
    Library test("/usr/lib/libsqlite3.so"); 

    std::string name = "sqlite3_libversion"; 
    const char* (*whatwhat)() = test.findFunction<const char*, void>(name); 
    // this SHOULD work. it's the right type now! >=[ 

    //const char* ver3 = whatwhat(); 
    //printf("blah says \"%s\"\n", ver3); 
} 

答えて

1

私は、あなたがそうでなければ、それはそれだけで空にする必要があります場合でも、変数引数リストを期待T...だけではなく...に戻った関数のシグネチャを変更する必要があると思います。

template<typename RetType, typename... T> 
RetType (*findFunction(const std::string& funcName))(T... Ts) const 
{ 
    return (RetType (*)(T...))findFunction(funcName); 
} 

次にタイプリストにvoidせずにそれを呼び出すと、それが動作するはずです:これらの変更により

const char* (*whatwhat)() = test.findFunction<const char*>(name); 

それはgcc-4.5.1に私のためにコンパイル:http://ideone.com/UFbut

+0

うわー、おかげで!それは私のリストに2番目の問題を修正します。ポインタからオブジェクトへの変換とポインタから関数への変換に関する警告をどのように回避できるかをご存じですか? – Sticky

+0

興味深いことに、少しウェブ検索を行うと、最初の問題は解決できないかもしれません。http://www.trilithium.com/johan/2004/12/problem-with-dlsym/ - 古いリンクですが、私はその行動が変わったとは思わないでください。 – tzaman

+0

はい、私はその記事を自分で見つけました。私はそれについて多くのことができるとは思わないが、それはGCCが作業用コードを作成して、とにかく文句を言ってくれるだけのものだ。この記事では、Windows上で同様の、しかし逆の問題について言及しています。だから私はこれが私の仕事に関係なく問題になると考えています。そのことを踏まえ、この問題を手伝ってくれてありがとう、ずっと今のところ私を悩ましていたことをありがとう。 – Sticky

関連する問題