1
私は、.dll
または.so
または同等のものを動的にロードするように設計されたクラスを持っています。そこから、あなたが探している機能にポインタを返します。残念ながら、実装には2つの問題があります。バリデリックテンプレートを使用した「コールに一致する関数がありません」
- 私は関数へのポインタとして* voidを返す「ダム」関数を使用している場合は、私は私が使用できる形式にそれらを操作しようとすると、私は
warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object
を取得します。 - バリデーションテンプレートとタイプセーフティで「スマート」機能を使用しようとすると、コンパイルできません。
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);
}
うわー、おかげで!それは私のリストに2番目の問題を修正します。ポインタからオブジェクトへの変換とポインタから関数への変換に関する警告をどのように回避できるかをご存じですか? – Sticky
興味深いことに、少しウェブ検索を行うと、最初の問題は解決できないかもしれません。http://www.trilithium.com/johan/2004/12/problem-with-dlsym/ - 古いリンクですが、私はその行動が変わったとは思わないでください。 – tzaman
はい、私はその記事を自分で見つけました。私はそれについて多くのことができるとは思わないが、それはGCCが作業用コードを作成して、とにかく文句を言ってくれるだけのものだ。この記事では、Windows上で同様の、しかし逆の問題について言及しています。だから私はこれが私の仕事に関係なく問題になると考えています。そのことを踏まえ、この問題を手伝ってくれてありがとう、ずっと今のところ私を悩ましていたことをありがとう。 – Sticky