【问题标题】:Code doesn't compile using std::pair and constructors [closed]代码不使用 std::pair 和构造函数编译 [关闭]
【发布时间】:2014-08-07 21:49:51
【问题描述】:

以下代码无法编译:

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

template <typename T1, typename T2>  
class meta {
   pair<T1,T2> xy_pair; 

   public: 
   /* meta(const T1 & t1, const T2 & t2) : 
    xy_pair.first(t1), 
    xy_pair.second(t2)
    {}*/
  meta() : 
    xy_pair.first(T1()), 
    xy_pair.second(T2())
    {}
  void print() const{
      cout << xy_pair.first << endl; 
      cout << xy_pair.second << endl; 
  }  

}; 

int main(){
 meta<int,int> met_xy; 

}

我收到以下编译器错误:

[root@localhost STL]# g++ -std=c++0x sets.cpp -o sets
sets.cpp: In constructor ‘meta<T1, T2>::meta()’:
sets.cpp:16:16: error: expected ‘(’ before ‘.’ token
sets.cpp:16:16: error: expected ‘{’ before ‘.’ token
sets.cpp: In member function ‘void meta<T1, T2>::print() const’:
sets.cpp:20:29: error: expected primary-expression before ‘,’ token
sets.cpp:20:32: error: expected primary-expression before ‘>’ token
sets.cpp:20:33: error: expected primary-expression before ‘.’ token
sets.cpp:21:29: error: expected primary-expression before ‘,’ token
sets.cpp:21:32: error: expected primary-expression before ‘>’ token
sets.cpp:21:33: error: expected primary-expression before ‘.’ token

【问题讨论】:

  • 这根本不是有效的 C++。使用: xy_pair{}

标签: c++ templates compiler-errors std-pair


【解决方案1】:

您不能像这样在初始化列表中初始化成员对象的各个子成员。实现它

meta() : xy_pair(T1(), T2()) {}

或者干脆

meta() {}

或者实际上只是完全省略默认构造函数 - 编译器生成的构造函数会做同样的事情。

【讨论】:

    【解决方案2】:

    您的代码应该如下所示:

    #include <utility>
    #include <ostream>
    #include <iostream>
    
    template <typename T1, typename T2>  
    class meta {
       std::pair<T1, T2> xy_pair;
    
    public: 
        meta(const T1 & t1, const T2 & t2) : xy_pair(t1, t2) { }
        // note initialization of the whole member xy_pair, not its members
        meta() : xy_pair() { }
    
        void print() const {
           cout << xy_pair.first << endl; 
           cout << xy_pair.second << endl; 
        }
    }; 
    
    int main() {
       meta<int, int> meta_xy;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2012-11-26
      • 2012-03-05
      相关资源
      最近更新 更多