【问题标题】:Can not use template argument in function declaration不能在函数声明中使用模板参数
【发布时间】:2011-11-24 17:07:35
【问题描述】:

我正在努力寻找以下代码无法编译的充分理由。 它给了我以下错误。

错误 2 错误 C2923:“std::pair”:“std::set::iterator”不是参数“_Ty1”的有效模板类型参数

我需要一点了解,为什么 C++ 不允许我在函数声明中使用模板参数,因为我使用 set::iterator 而不是 set::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);
}

【问题讨论】:

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


    【解决方案1】:

    您似乎需要在 set&lt;T&gt;::iterator 之前添加 typename 关键字。这是因为编译器不知道set&lt;T&gt;::iterator 是一种类型,因为set&lt;T&gt; 不是特定的实例化。 set&lt;T&gt;::iterator 可以是任何东西,编译器默认它是静态成员。所以你需要typename set&lt;T&gt;::iterator 告诉他iterator 是一个类型。 set&lt;int&gt; 不需要这个,因为这是一个特定的实例化,编译器知道它的所有成员。

    【讨论】:

      【解决方案2】:

      你需要告诉编译器set&lt;T&gt;::iterator 是一个类型。您可以使用 typename 关键字来执行此操作,如下所示:

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

      【讨论】:

        【解决方案3】:

        您所需要的只是“typename”关键字。由于你的 print 函数是用 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);
        }
        

        【讨论】:

          猜你喜欢
          • 2021-12-31
          • 2011-08-27
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多