bind2ndでエラーになる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Cr
記事: 93
登録日時: 8年前

bind2ndでエラーになる

#1

投稿記事 by Cr » 8年前

環境はg++4.6.2でXPです

コード:

#include <functional>
#include <vector>
#include <algorithm>
using namespace std;

class Comparison
{
public:
	bool operator() (int a,int b)
	{
		return a>b;
	}
};

int main(){

	vector<int> vec;
	for(int i = 0; i < 10; i++)
		vec.push_back(i);

	find_if(vec.begin(),vec.end(),bind2nd(Comparison(),5));
	
	return 0;
}
以下がエラーコードです

コード:

g++ a.cpp
In file included from j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_function.h:731:0,
                 from j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/functional:50,
                 from a.cpp:1:j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h: 'std::binder2nd<Comparison>' のインスタンス内:
a.cpp:24:54:   instantiated from here
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h:135:11: エラー: no type named 'first_argument_type' in 'class Comparison'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h:141:49: エラー: no type named 'second_argument_type' in 'class Comparison'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h:144:7: エラー: no type named 'second_argument_type' in 'class Comparison'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h:149:7: エラー: no type named 'result_type' in 'class Comparison'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h:155:7: エラー: no type named 'result_type' in 'class Comparison'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h: 関数 'std::binder2nd<_Operation> std::bind2nd(const _Operation&, const _Tp&) [with _Operation = Comparison, _Tp = int]' 内:
a.cpp:24:54:   instantiated from here
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward/binders.h:164:57: エラー: no type named 'second_argument_type' in'class Comparison'
In file included from j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/algorithm:63:0,
                 from a.cpp:3:
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h: 関数 '_RandomAccessIterator
std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with_RandomAccessIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, _Predicate = std::binder2nd<Comparison>]' 内:
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:4427:41:   '_IIter std::find_if(_IIter, _IIter, _Predicate) [with_IIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, _Predicate = std::binder2nd<Comparison>]' から実体化されました
a.cpp:24:55:   instantiated from here
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:210:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:4427:41:   '_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, _Predicate = std::binder2nd<Comparison>]' から実体化されました
a.cpp:24:55:   instantiated from here
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:214:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:218:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:222:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:230:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:234:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:238:4: エラー: '(std::binder2nd<Comparison>) (int&)' への呼び出しが適合しません

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: bind2ndでエラーになる

#2

投稿記事 by beatle » 8年前

改良版コードです

コード:

#include <functional>
#include <vector>
#include <algorithm>
using namespace std;

class Comparison : public std::binary_function<int, int, int>
{
public:
    bool operator() (int a,int b) const
    {
        return a>b;
    }
};

int main(){

    vector<int> vec;
    for(int i = 0; i < 10; i++)
        vec.push_back(i);

    find_if(vec.begin(),vec.end(),bind2nd(Comparison(),5));

    return 0;
}
ポイントは,std::binary_functionを継承することと,operatorをconstにすることです.

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: bind2ndでエラーになる

#3

投稿記事 by beatle » 8年前

ちなみに,C++11時代はbind系関数なんて過去のものです.

コード:

#include <functional>
#include <vector>
#include <algorithm>
using namespace std;

int main(){

    vector<int> vec(10);
    iota(begin(vec), end(vec), 0);

    find_if(vec.begin(),vec.end(),[](int a){ return a>5; });
}

アバター
Cr
記事: 93
登録日時: 8年前

Re: bind2ndでエラーになる

#4

投稿記事 by Cr » 8年前

>beatleさん
"bind2nd 継承"で検索かけたらいろいろ引っかかりました。
使用するのの必須条件なんですね
どうもありがとうございました。
最後に編集したユーザー Cr on 2012年3月02日(金) 14:27 [ 編集 1 回目 ]

アバター
Cr
記事: 93
登録日時: 8年前

Re: bind2ndでエラーになる

#5

投稿記事 by Cr » 8年前

返信書いてる間にもう一つ書いてくださってたみたいで
beatle さんが書きました:

コード:

    find_if(vec.begin(),vec.end(),[](int a){ return a>5; });
そんな書き方もできるんですね。

今悩んでたプログラムの

コード:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <functional>
using namespace std;

class ufo{
private:
	int x;
	int y;
	int r;
	int v;
	int move_length;

public:
	ufo( int x_,int y_,int r_, int v_):
	x(x_),y(y_),r(r_),v(v_),move_length(v_){}
	
	bool operator < (const ufo& one) const{
		return sqrt(x*x+y*y)-move_length < 
				sqrt(one.x*one.x + one.y*one.y) -one.move_length;
	}
	double length()
	{
		return sqrt(x*x+y*y)-move_length;
	}
	void move()
	{
		move_length += v;
	}
};


class can_shoot : public std::binary_function<int, int, int>
{
public:
	bool operator() (ufo& one,int laser) const
	{
		return one.length() > laser;
	}
};

int main(){

	int laser,num;
	int x,y,r,v;//初期読み取り用変数
	vector<ufo> vec;

	cin >> laser >> num;
	for(int i = 0 ; i < num; i++){
		
		cin >> x >> y >> r >> v;
		vec.push_back(ufo(x,y,r,v));
		
	}
	
	sort(vec.begin(),vec.end());
	find_if(vec.begin(),vec.end(),bind2nd(can_shoot(),5));
	return 0;
}

をそれで書きかえるとしたら

コード:

find_if(vec.begin(),vec.end(),[](ufo one){ return one.length() > laser; });
となるんですかね
コンパイルは通ったし
今度からこちらの書き方で書きたいと思います。

アバター
Cr
記事: 93
登録日時: 8年前

Re: bind2ndでエラーになる

#6

投稿記事 by Cr » 8年前

別のファイルをコンパイルしてました…
下記のソースをコンパイルしたところエラーになりました。
あくまでも、固定する片方の値を変数で固定したい場合はどうすればいいのでしょうか?

コード:

#include <functional>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
 
int main(){
	int b;
	cin >> b;
    vector<int> vec;
    for(int i = 0; i < 10; i++)
		vec.push_back(i);
 
    find_if(vec.begin(),vec.end(),[](int a){ return a>b; });
}
↓エラーコード

コード:

g++ a.cpp
a.cpp: ラムダ関数内:
a.cpp:14:55: エラー: 'b' is not captured
a.cpp:14:58: エラー: return-statement with a value, in function returning 'void'
 [-fpermissive]
a.cpp: 関数 'int main()' 内:
a.cpp:14:58: 警告: lambda expressions only available with -std=c++0x or -std=gnu++0x [デフォルトで有効]
a.cpp:14:59: エラー: 'find_if(std::vector<int>::iterator, std::vector<int>::iterator, main()::<ラムダ(int)>)' の呼び出しに適合する関数がありません
a.cpp:14:59: 備考: 候補:
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:4418:5: 備考:
template<class _IIter, class _Predicate> _IIter std::find_if(_IIter, _IIter, _Predicate)

アバター
Cr
記事: 93
登録日時: 8年前

Re: bind2ndでエラーになる

#7

投稿記事 by Cr » 8年前

--std=c++0xを忘れてました。
しかしやはりエラーになります

コード:

g++ --std=c++0x a.cpp
a.cpp: ラムダ関数内:
a.cpp:14:55: エラー: 'b' is not captured
a.cpp:14:58: エラー: return-statement with a value, in function returning 'void'
 [-fpermissive]
In file included from j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/algorith
m:63:0,
                 from a.cpp:3:
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h: 関数 '_Random
AccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Pre
dicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx
::__normal_iterator<int*, std::vector<int> >, _Predicate = main()::<ラムダ(int)>
]' 内:
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:4427:41:   '_I
Iter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal
_iterator<int*, std::vector<int> >, _Predicate = main()::<ラムダ(int)>]' から実
体化されました
a.cpp:14:59:   instantiated from here
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:210:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:4427:41:   '_I
Iter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal
_iterator<int*, std::vector<int> >, _Predicate = main()::<ラムダ(int)>]' から実
体化されました
a.cpp:14:59:   instantiated from here
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:214:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:218:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:222:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:230:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:234:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'
j:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:238:4: エラー:
 could not convert '__pred.main()::<ラムダ(int)>(__first.__gnu_cxx::__normal_ite
rator<_Iterator, _Container>::operator* [with _Iterator = int*, _Container = std
::vector<int>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference =
int&]())' from 'void' to 'bool'

アバター
Cr
記事: 93
登録日時: 8年前

Re: bind2ndでエラーになる

#8

投稿記事 by Cr » 8年前

すみません。
エラ-メッセージ内にあったラムダ関数で検索を書けたら自己解決しました。

コード:

#include <functional>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
 
int main(){
	int b;
	cin >> b;
    vector<int> vec(10);
    for(int i = 0; i < 10; i++)
		vec.push_back(i);
 
    find_if(vec.begin(),vec.end(),[b](int a){ return a>b; });
}
最初の[]で渡せるんですね。
どうもお騒がせしました。

閉鎖

“C言語何でも質問掲示板” へ戻る