我很难找到以下代码无法编译的充分理由。 它给了我以下错误。
错误2错误C2923:'std :: pair':'std :: set :: iterator'不是参数'_Ty1'的有效模板类型参数
我需要一点见解,为什么C ++不允许我在函数声明中使用template参数,因为我使用set< int> :: iterator而不是set< T> :: 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);
}
答案 0 :(得分: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 :(得分:3)
您似乎需要在typename
之前使用set<T>::iterator
关键字。这是因为编译器不知道set<T>::iterator
是一种类型,因为set<T>
不是特定的实例。 set<T>::iterator
可以是任何内容,编译器默认情况下假定它是静态成员。因此,您需要typename set<T>::iterator
告诉他iterator
是一种类型。 set<int>
不需要这个,因为这是一个特定的实例化,编译器知道它的所有成员。
答案 2 :(得分:1)
您需要告诉编译器set<T>::iterator
是一种类型。您可以使用typename
关键字执行此操作,如下所示:
void print(const pair< typename set<T>::iterator, bool> &p) //<- Here is the problem