2012-02-21 14 views
2

、Iは、インライン関数が蛇腹のような定義があります。最後の行でインライン関数コールエラー

extern CMODEXPORT int FMI_invoke_delete_as_class 
(
    FEATURE_RECORD_p_t frec,  /* I: Feature record */ 
    FMI_delete_fn_p_t fn  /* I: Function pointer */ 
); 

template<class T> 
inline int FMI_invoke_delete_as_class(FEATURE_RECORD_p_t frec) // I: Feature record 
{ 
    class FMIHelper 
    { 
    public: 
     static int DeleteParms(FEATURE_RECORD_p_t frec) 
     { 
     //.... 
     return error; 
     } 
    }; 
    return FMI_invoke_delete_as_class(frec, &FMIHelper::DeleteParms); 
} 

FMI_invoke_delete_as_class の呼び出しは、この機能があるような別の.Cファイルで定義されヘッダファイル内FMI_invoke_delete_as_classの宣言は、私が投稿のように、インライン関数の前にある場合

extern int FMI_invoke_delete_as_class 
(
    FEATURE_RECORD_p_t frec,  /* I: Feature record */ 
    OM_class_t   class_id /* I: Object class */ 
) 
{ 
    //... 
} 

extern int FMI_invoke_delete_as_class 
(
    FEATURE_RECORD_p_t frec,  /* I: Feature record */ 
    FMI_delete_fn_p_t fn  /* I: Function pointer */ 
) 

は、インライン目的球の呼び出しはokです。しかし、そのインライン関数の後に宣言を置くと、.cファイル内で間違った関数が呼び出されます。 私はなぜ、ちょうどLinuxの下で起こるか分からない。私は次のコードでしようと試み

+0

あなたのカスタムタイプを代入/定義できますか?問題を再現する方が簡単です。 – gwiazdorrr

答えて

0

/** kk.h */ 
#include <iostream> 
struct FEATURE_RECORD_p_t 
{ 
    int kk; 
}; 

template<class T> 
inline int FMI_invoke_delete_as_class(FEATURE_RECORD_p_t frec) // I: Feature record 
{ 
    class FMIHelper 
    { 
     public: 
      static int DeleteParms(FEATURE_RECORD_p_t frec) 
      { 
       //.... 
       std::cout << "DeleteParms" << std::endl; 
       frec.kk = 100; 
       return frec.kk; 
      } 
    }; 

    std::cout << "FMI_invoke_delete_as_class<>" << std::endl; 
    return FMI_invoke_delete_as_class(frec, &FMIHelper::DeleteParms); 
} 

typedef int (*FMI_delete_fn_p_t)(FEATURE_RECORD_p_t); 

extern int FMI_invoke_delete_as_class 
(
    FEATURE_RECORD_p_t frec,  /* I: Feature record */ 
    FMI_delete_fn_p_t fn  /* I: Function pointer */ 
); 

#include "kk.h" 
extern int FMI_invoke_delete_as_class 
(
    FEATURE_RECORD_p_t frec,  /* I: Feature record */ 
    int     class_id /* I: Object class */ 
) 
{ 
    std::cout << "FMI_invoke_delete_as_class (bad)" << std::endl; 
    return 0; 
} 

extern int FMI_invoke_delete_as_class 
(
    FEATURE_RECORD_p_t frec,  /* I: Feature record */ 
    FMI_delete_fn_p_t fn  /* I: Function pointer */ 
) 
{ 
    std::cout << "FMI_invoke_delete_as_class" << std::endl; 
    return fn(frec); 
} 

int main() 
{ 
    FEATURE_RECORD_p_t kk; 

    FMI_invoke_delete_as_class<int>(kk); 
    return 0; 
} 

と印刷結果は次のとおりです。

FMI_invoke_delete_as_class<> 
FMI_invoke_delete_as_class 
DeleteParms 

それはOK縫い目。インライン関数をどのように呼び出すのですか?あなたのタイプ定義はどうですか?あなたのコンパイルコマンドはどちらですか?私はg++ (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)g++ -g -o kk kk.cppコマンドラインを使用しています

+0

ご協力ありがとうございます。私は非常に明確にコンパイラのバージョンとコマンドを苦情を知らない。私は自分の会社のビルドコマンドを使用しているからです。私はこれが共通の問題だと思った。 – JeromeCui

関連する問題