2011-09-25 31 views
5

次のコードがコンパイルされない理由がわかりません。 以下のエラーが表示されます。関数の宣言でテンプレート引数を使用できません

エラー2エラーC2923: 'STD ::ペア': 'のstd ::セット::イテレータは' パラメータの有効なテンプレート型引数ではありません '_Ty1'

私は少し洞察力を必要としますなぜ、私は関数の宣言でテンプレートパラメータを使用することができないのですか?C++では、< T> :: iteratorがセットされているのではなく、< int> :: iteratorを使用しています。

#include<iostream> 
#include<set> 
using namespace std; 

template <typename T> 
void print(const pair< set<T>::iterator, bool> &p) //<- Here is the problem 
{ 
    cout<<"Pair "<<*(p.first)<<" "<<p.second<<"\n"; 
} 

int main() { 
    set<int> setOfInts; 
    setOfInts.insert(10);  
    pair<set<int>::iterator, bool > p = setOfInts.insert(30); 
} 

答えて

9

"typename"というキーワードが必要です。あなたのプリント関数はTでテンプレート化されているので、コンパイラにset :: iteratorは値ではなくタイプであることを伝える必要があります。こうやって。

#include<iostream> 
#include<set> 
#include <utility> 
using namespace std; 

template <typename T> 
void print(const pair< typename set<T>::iterator, bool> &p) //<- Here is the problem 
{ 
    cout<<"Pair "<<*(p.first)<<" "<<p.second<<"\n"; 
} 

int main() { 
    set<int> setOfInts; 
    setOfInts.insert(10);  
    pair<set<int>::iterator, bool > p = setOfInts.insert(30); 
} 
1

set<T>::iteratorがタイプであることをコンパイラに伝える必要があります。あなたがset<T>::iteratortypenameキーワードを必要とするようだ

void print(const pair< typename set<T>::iterator, bool> &p) //<- Here is the problem 
3

次のようにあなたは、typenameキーワードを使用してそれを行います。これは、set<T>は特定のインスタンス化ではないため、コンパイラはset<T>::iteratorが型であることを知らないためです。 set<T>::iteratorは何でもかまいません。また、コンパイラはデフォルトで静的メンバーであるとみなします。だからtypename set<T>::iteratoriteratorがタイプであることを彼に伝える必要があります。 set<int>の場合は、特定のインスタンス化であり、コンパイラはすべてのメンバを知っているため、これは必要ありません。

関連する問題