不能在函数声明中使用模板参数

时间:2011-09-25 17:02:54

标签: c++ templates visual-c++ stl metaprogramming

我很难找到以下代码无法编译的充分理由。 它给了我以下错误。

  

错误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);
}

3 个答案:

答案 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