1

std::sortオブジェクトのベクトルを並べ替えるためにアルゴリズムに渡す次の比較関数があります。

template <typename PointT>
bool myCompareLines (A<PointT>::model_struct model_a, A<PointT>::model_struct model_b) {
    return (/* some comparison code*/);
}

比較関数はクラスの外部で宣言されており、次のように呼び出しています。

template <typename PointT>
class B {
    [...]
    std::sort(lines.begin().lines.end(),::myCompareLines);
    [...]
}

コンパイルすると、次のエラーが発生します。template declaration of 'bool myCompareLines'

内部では、プライベートタイプにアクセスできるようにフレンドクラスとしてclass A宣言します。私は何が欠けていますか?class Bclass Bmodel_struct

4

4 に答える 4

2

恐ろしいですが、これはあなたが探しているものですか?注:コンパイルは良いとは限りません。これがあなたのために働くとしても、私はあなたの階層を宣言する別の方法を提案するでしょう。

template<class PointT>
class A
{
public:
    A() {};

    struct model_stuct
    {
        // need something to use in comparison, so i just threw this in.
        int value;
    };
};

// comparitor
template<class PointT>
bool compareLines(
    const typename A<PointT>::model_stuct& left,
    const typename A<PointT>::model_stuct& right)
{
    return left.value < right.value;
}

template<class PointT>
class B
{
public:
    B() : lines() {};

    void sort()
    {
        std::sort(lines.begin(), lines.end(), compareLines<PointT>);
    }

    std::vector<typename A<PointT>::model_stuct> lines;
};


// main entrypoint
int main(int argc, char *argv[])
{
    // this does nothing, but demonstrate that it can compile and
    //  sort() doesn't puke. 
    B<int> bInt;
    bInt.sort();
    return 0;
}
于 2012-10-15T00:09:01.057 に答える
1

あなたはただするべきではありません:

template <typename PointT>
class B {
    [...]
    std::sort(lines.begin(), lines.end(), ::myCompareLines<PointT>);
    [...]
}
于 2012-10-14T23:52:27.740 に答える
1

CompareLines署名にtypenameキーワードがありませんでした。

これはそれを修正します:

bool myCompareLines (typename A<PointT>::model_struct model_a, typename B<PointT>::model_struct model_b)
于 2012-10-15T01:51:04.740 に答える
0

PointTコンパイラは、内部クラスからテンプレートパラメータを推測できませんA<PointT>::model_struct

の多くの専門分野A<PointT>が同一である可能性があるため、それはできませんmodel_struct-次のように:

template <class PointT>
class A {
public:
  typedef int model_struct;
};

この例では:

   int a;
   bool res = compareLines(a,a);

model_structトップレベルのテンプレートとして定義します。

于 2012-10-14T23:50:31.553 に答える