1

こんにちは私は次のクラスを持っています:

template<class T>
class RandomTree<T> {
private:
    RandomTreeNode root;
    typedef double (*funcion_ptr) (T, T);

public:
    RandomTree(std::vector<function_ptr> functions){...}
};

template<class T>
class RandomTreeNode<T> {
private:
    typedef double (*funcion_ptr) (T, T);
    function_ptr function;
public:
    RandomTreeNode(function_ptr function){...}
};

ツリーには関数ポインタのベクトルが与えられ、各ノードが作成され、1つの特定の関数があります。typedef double (*function_ptr) (T,T)両方のクラスでを定義する必要がない方法はありますか?

4

3 に答える 3

3

メンバー関数ポインターとは対照的に、独立した関数ポインター型を宣言しているため、もちろん、typedef をグローバル スコープまたは名前空間内の別のテンプレート クラスに配置して、両方のクラスからアクセスできるようにすることができます。

このような:

template<class T>
struct RandomTreeFunction
{
    typedef double (*function_ptr)(T, T);
};

template<class T>
class RandomTree<T> {
private:
    typedef typename RandomTreeFunction<T>::function_ptr function_ptr;
    ...
};

代わりに使用することも検討することをお勧めしますstd::function

于 2012-10-17T11:18:45.017 に答える
0

テンプレートエイリアスをサポートするコンパイラ(gcc> = 4.7、clang> = 3.0など)にアクセスできる場合は、次のように実行できます。

#include <vector>

template<class T>
using function_ptr = double (*)(T,T);  

template<class T>
class RandomTreeNode {
private:
    function_ptr<T> function;
public:
    RandomTreeNode(function_ptr<T> function){/*...*/}
};

template<class T>
class RandomTree {
private:
    RandomTreeNode<T> root;

public:
    RandomTree(std::vector<function_ptr<T>> functions){/*...*/}
};

それ以外の場合は、JoachimPileborgによる解決策で十分です。

于 2012-10-17T11:24:50.817 に答える
0

で公開する場合は、次のようにRandomTreeNode<T>言えます。

template<class T>
class RandomTree<T> {
    typedef RandomTreeNode<T>::funcion_ptr function_ptr;
};

またはRandomTreeNode<T>::funcion_ptr直接使用しますが、これは非常に面倒です。

于 2012-10-17T11:22:13.610 に答える