2013-07-25 18 views
5
#include <iostream> 
#include <iterator> 
using namespace std; 
void print(int ia[]) 
{ 
    int *p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

int main() 
{ 
    int ia[] = {1,2,3,4},i; 
    print(ia); 

    return 0; 
} 

iaの最初の要素へのポインタ。 それは「エラー: 『開始(int型* &)』への呼び出しに該当する機能C++」と述べ、なぜ! 感謝:)エラー: 'begin(int *&)'の呼び出しで一致する関数がありません。C++

+2

@ KarthikT:それは違いはありません。ポインタ上で 'begin'を呼び出すことはこれまでにないでしょう。 –

+0

@EdS。私はそれを見ましたか? –

答えて

10

があるためprint()内で、変数iaがポインタではなく配列です。ポインタ上でbegin()と呼ぶのは意味がありません。

+0

私はそれを得ました!非常にありがとう!:) – Aleeee

4

ポインタにフリー関数beginendを使用していますが、これは許可されていません。他の人が指摘したように

あなたがC++ 11のintializer_list

//g++ -std=c++0x test.cpp -o test 
#include <iostream> 
#include <iterator> 
using namespace std; 
void print(initializer_list<int> ia) 
{ 
    auto p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

int main() 
{ 
    print({1,2,3,4}); 
    return 0; 
} 
+1

私はまた、範囲ベースの使用をお勧めします。 – soon

+0

ありがとう!:)これは良い方法です! – Aleeee

+0

これはパフォーマンスに関してどうですか? – Jakobovski

2

と似た何かを行うことができ、あなたの配列はポインタに減衰されます。 DecayingはCの歴史的なアーティファクトです。あなたが望むことをするには、配列を参照として渡し、配列のサイズを推測してください:

template<size_t N> 
void print(int (&ia[N]) 
{ 
    int *p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

... 

print(ia); 
+0

ありがとう!:)あなたは良い人です! – Aleeee