0
#include<iostream>
#include<vector>
#include<algorithm>
class Integer
    {
public:
    int m;
    Integer(int a):m(a){};
    };
class CompareParts
    {
    public:
        bool operator()(const Integer & p1,const Integer & p2)
            {
            return p1.m<p2.m;
            }
    }obj1;
int main()
    {
    std::vector<Integer> vecInteger;
    vecInteger.push_back(Integer(12));
    vecInteger.push_back(Integer(13));
    vecInteger.push_back(Integer(5));
    vecInteger.push_back(Integer(7));
    vecInteger.push_back(Integer(9));
    Integer obj2();
    std::sort(vecInteger.begin(),vecInteger.end(),obj1);
    std::sort(vecInteger.begin(),vecInteger.end(),obj2);
    }

why is obj2 in second sort function leads to compiler error.

4

5 に答える 5

15

Integer obj2()はオブジェクトの定義ではなく、 をobj2返すという名前の関数の宣言ですInteger(理由を理解するために関数の外に置いてください)。これは、より複雑な構造で発生することもあり、さらに混乱を招く可能性があります。これを最も厄介な parseと呼ぶ人もいます。

より複雑なケースの約束された例を次に示します。

struct Foo {};
struct Bar { Bar(Foo); };

Bar quxx(Foo()); // quxx is a function

以下quxxは、Bar を返し、Foo を返す関数への (ポインタ) をパラメーターなしで取得する関数です。次のように、同じ宣言をより明確に記述できます。

Bar quxx(Foo (*fn)()); // quxx is the same function as above

Foo を取るコンストラクターで初期化された変数の定義を取得するには、括弧のレベルを追加できます。

Bar quux((Foo())); // quux is a variable
于 2009-08-19T14:26:47.453 に答える
3

obj2 は関数だからです。これを見る

于 2009-08-19T14:29:52.533 に答える
1

引数コンストラクターがないという定義はありません。

使用、整数obj2(0);

#include<iostream>
#include<vector>
#include<algorithm>
class Integer
{
     public:
     int m;
     Integer(int a):m(a){};
     bool operator()(const Integer p1,const Integer p2)
     {
      return p1.m<p2.m;
     }
};
class CompareParts
{    public:
     bool     operator()(const Integer  p1,const Integer p2)
     {
         return p1.m<p2.m;
         }
}obj1;

int main()
{
    std::vector<Integer> vecInteger;
    vecInteger.push_back(Integer(12));
    vecInteger.push_back(Integer(13));
    vecInteger.push_back(Integer(5));
    vecInteger.push_back(Integer(7));
    vecInteger.push_back(Integer(9));
    Integer obj2(0);
    std::sort(vecInteger.begin(),vecInteger.end(),obj1);
    std::sort(vecInteger.begin(),vecInteger.end(),obj2);

    return 0;
}
于 2009-08-19T14:44:21.917 に答える
1

obj2 は BinaryPredicate ではなく、std::sort の 3 番目のパラメーターとして無効です

obj2 は次のようにする必要があります

// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 )
{
   return elem1 > elem2;
}

または obj1 で使用されるファンクター型。

于 2009-08-19T14:35:47.873 に答える
0
#include<iostream>
#include<vector>
#include<algorithm>

class Integer
{
public:
int m;
Integer(int a):m(a){};
};

class CompareParts {
public:
bool operator()(const Integer&p1、const Integer&p2)
{
return p1.m}
};

int main()
{
std :: vector vecInteger;
vecInteger.push_back(Integer(12));
vecInteger.push_back(Integer(13));
vecInteger.push_back(Integer(5));
vecInteger.push_back(Integer(7));
vecInteger.push_back(Integer(9));

std::sort(vecInteger.begin(),vecInteger.end(),CompareParts()); 
typedef vector<Integer>::const_iterator Iter;
Iter beg = vecInteger.begin();
Iter end = vecInteger.end();

for (Iter iter = beg; iter != end; ++iter)
    cout << (*iter).m << " ";

cout << endl;

}

出力:5 7 9 12 13

于 2009-08-19T14:43:03.243 に答える