protobuff在vs2010下编译时错误:'type'

protobuff在vs2010下编译时提示:'type' : is not a member of'std::tr1::tuple_element'错误

 

这个错误是google开发人员引起的,暂时还没有推出解决此问题的版本包,但是他们提供了两个方案,两方案都能编译通过,但还会有两个警告,暂时未发现影响

1 在gtest-port.h中将GTEST_USE_OWN_TR1_TUPLE=1改为GTEST_USE_OWN_TR1_TUPLE=0

2  替换gtest-tuple.h,下载地址为http://code.google.com/p/googletest/issues/detail?id=217最下面的download。

也可直接使用下面的代码替换(以下代码即提供的新程序)

// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!! 
 
// Copyright 2009 Google Inc. 
// All Rights Reserved. 
// 
// Redistribution and use in source and binary forms, with or without 
// modification, are permitted provided that the following conditions are 
// met: 
// 
//     * Redistributions of source code must retain the above copyright 
// notice, this list of conditions and the following disclaimer. 
//     * Redistributions in binary form must reproduce the above 
// copyright notice, this list of conditions and the following disclaimer 
// in the documentation and/or other materials provided with the 
// distribution. 
//     * Neither the name of Google Inc. nor the names of its 
// contributors may be used to endorse or promote products derived from 
// this software without specific prior written permission. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
// 
// Author: wan@google.com (Zhanyong Wan) 
 
// Implements a subset of TR1 tuple needed by Google Test and Google Mock. 
 
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ 
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ 
 
#if _MSC_VER < 1600 
        #include<utility>  // For ::std::pair. 
        //.. also define tuple below for <=VS2008 
#else 
        #include<tuple> //VS010 
#endif 
 
 
// The compiler used in Symbian has a bug that prevents us from declaring the 
// tuple template as a friend (it complains that tuple is redefined).  This 
// hack bypasses the bug by declaring the members that should otherwise be 
// private as public. 
#if defined(__SYMBIAN32__) 
#define GTEST_DECLARE_TUPLE_AS_FRIEND_public: 
#else 
#define GTEST_DECLARE_TUPLE_AS_FRIEND_\ 
    template<GTEST_10_TYPENAMES_(U)>friend class tuple;\ 
   private: 
#endif 
 
// GTEST_n_TUPLE_(T) is the type of an n-tuple. 
#define GTEST_0_TUPLE_(T) tuple<> 
#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \ 
    void,void, void> 
#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \ 
    void,void, void> 
#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \ 
    void,void, void> 
#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \ 
    void,void, void> 
#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \ 
    void,void, void> 
#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \ 
    void,void, void> 
#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ 
    void,void, void> 
#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ 
    T##7, void, void> 
#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ 
    T##7, T##8, void> 
#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \ 
    T##7, T##8, T##9> 
 
// GTEST_n_TYPENAMES_(T) declares a list of n typenames. 
#define GTEST_0_TYPENAMES_(T) 
#define GTEST_1_TYPENAMES_(T)typename T##0 
#define GTEST_2_TYPENAMES_(T)typename T##0, typename T##1 
#define GTEST_3_TYPENAMES_(T)typename T##0, typename T##1, typename T##2 
#define GTEST_4_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3 
#define GTEST_5_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3, typename T##4 
#define GTEST_6_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3, typename T##4, typename T##5 
#define GTEST_7_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3, typename T##4, typename T##5, typename T##6 
#define GTEST_8_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7 
#define GTEST_9_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3, typename T##4, typename T##5, typename T##6, \ 
    typename T##7, typename T##8 
#define GTEST_10_TYPENAMES_(T)typename T##0, typename T##1, typename T##2, \ 
    typename T##3, typename T##4, typename T##5, typename T##6, \ 
    typename T##7, typename T##8, typename T##9 
 
#if _MSC_VER < 1600 
// In theory, defining stuff in the ::std namespace is undefined 
// behavior.  We can do this as we are playing the role of a standard 
// library vendor. 
namespace std { 
namespace tr1 { 
 
template <typename T0= void,typename T1 =void, typename T2 =void, 
    typename T3= void,typename T4 =void, typename T5 =void, 
    typename T6= void,typename T7 =void, typename T8 =void, 
    typename T9= void> 
class tuple; 
 
// Anything in namespace gtest_internal is Google Test's INTERNAL 
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. 
namespace gtest_internal{ 
 
// ByRef<T>::type is T if T is a reference; otherwise it's const T&. 
template <typename T> 
struct ByRef{ typedefconst T& type;};  // NOLINT 
template <typename T> 
struct ByRef<T&>{ typedef T& type;};  // NOLINT 
 
// A handy wrapper for ByRef. 
#define GTEST_BY_REF_(T)typename ::std::tr1::gtest_internal::ByRef<T>::type 
 
// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This 
// is the same as tr1::add_reference<T>::type. 
template <typename T> 
struct AddRef{ typedef T& type;};  // NOLINT 
template <typename T> 
struct AddRef<T&>{ typedef T& type;};  // NOLINT 
 
// A handy wrapper for AddRef. 
#define GTEST_ADD_REF_(T)typename ::std::tr1::gtest_internal::AddRef<T>::type 
 
// A helper for implementing get<k>(). 
template <int k>class Get; 
 
// A helper for implementing tuple_element<k, T>.  kIndexValid is true 
// iff k < the number of fields in tuple type T. 
template <bool kIndexValid,int kIndex,class Tuple> 
struct TupleElement; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,0, GTEST_10_TUPLE_(T)>{ typedef T0 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,1, GTEST_10_TUPLE_(T)>{ typedef T1 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,2, GTEST_10_TUPLE_(T)>{ typedef T2 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,3, GTEST_10_TUPLE_(T)>{ typedef T3 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,4, GTEST_10_TUPLE_(T)>{ typedef T4 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,5, GTEST_10_TUPLE_(T)>{ typedef T5 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,6, GTEST_10_TUPLE_(T)>{ typedef T6 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,7, GTEST_10_TUPLE_(T)>{ typedef T7 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,8, GTEST_10_TUPLE_(T)>{ typedef T8 type;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct TupleElement<true,9, GTEST_10_TUPLE_(T)>{ typedef T9 type;}; 
 
}  // namespace gtest_internal 
 
template <> 
class tuple<>{ 
 public: 
  tuple(){} 
  tuple(const tuple&/* t */)  {} 
  tuple&operator=(const tuple&/* t */){ return*this;} 
}; 
 
template <GTEST_1_TYPENAMES_(T)> 
class GTEST_1_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0){} 
 
  tuple(const tuple& t): f0_(t.f0_){} 
 
  template<GTEST_1_TYPENAMES_(U)> 
  tuple(const GTEST_1_TUPLE_(U)& t): f0_(t.f0_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_1_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_1_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_1_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_1_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    return*this; 
  } 
 
  T0 f0_; 
}; 
 
template <GTEST_2_TYPENAMES_(T)> 
class GTEST_2_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1): f0_(f0), 
      f1_(f1){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_){} 
 
  template<GTEST_2_TYPENAMES_(U)> 
  tuple(const GTEST_2_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_){} 
  template<typename U0,typename U1> 
  tuple(const::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_2_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_2_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
  template<typename U0,typename U1> 
  tuple&operator=(const::std::pair<U0, U1>& p) { 
    f0_ = p.first; 
    f1_ = p.second; 
    return*this; 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_2_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_2_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
}; 
 
template <GTEST_3_TYPENAMES_(T)> 
class GTEST_3_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2): f0_(f0), f1_(f1), f2_(f2){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_){} 
 
  template<GTEST_3_TYPENAMES_(U)> 
  tuple(const GTEST_3_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_3_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_3_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_3_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_3_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
}; 
 
template <GTEST_4_TYPENAMES_(T)> 
class GTEST_4_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2), 
      f3_(f3){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_){} 
 
  template<GTEST_4_TYPENAMES_(U)> 
  tuple(const GTEST_4_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_4_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_4_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_4_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_4_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
}; 
 
template <GTEST_5_TYPENAMES_(T)> 
class GTEST_5_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, 
      GTEST_BY_REF_(T4) f4): f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), 
      f4_(t.f4_){} 
 
  template<GTEST_5_TYPENAMES_(U)> 
  tuple(const GTEST_5_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_), f4_(t.f4_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_5_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_5_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_5_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_5_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    f4_ = t.f4_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
  T4 f4_; 
}; 
 
template <GTEST_6_TYPENAMES_(T)> 
class GTEST_6_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, 
      GTEST_BY_REF_(T5) f5): f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), 
      f5_(f5){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), 
      f4_(t.f4_), f5_(t.f5_){} 
 
  template<GTEST_6_TYPENAMES_(U)> 
  tuple(const GTEST_6_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_6_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_6_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_6_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_6_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    f4_ = t.f4_; 
    f5_ = t.f5_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
  T4 f4_; 
  T5 f5_; 
}; 
 
template <GTEST_7_TYPENAMES_(T)> 
class GTEST_7_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, 
      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2), 
      f3_(f3), f4_(f4), f5_(f5), f6_(f6){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), 
      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_){} 
 
  template<GTEST_7_TYPENAMES_(U)> 
  tuple(const GTEST_7_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_7_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_7_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_7_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_7_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    f4_ = t.f4_; 
    f5_ = t.f5_; 
    f6_ = t.f6_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
  T4 f4_; 
  T5 f5_; 
  T6 f6_; 
}; 
 
template <GTEST_8_TYPENAMES_(T)> 
class GTEST_8_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, 
      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, 
      GTEST_BY_REF_(T7) f7): f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), 
      f5_(f5), f6_(f6), f7_(f7){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), 
      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_){} 
 
  template<GTEST_8_TYPENAMES_(U)> 
  tuple(const GTEST_8_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_8_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_8_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_8_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_8_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    f4_ = t.f4_; 
    f5_ = t.f5_; 
    f6_ = t.f6_; 
    f7_ = t.f7_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
  T4 f4_; 
  T5 f5_; 
  T6 f6_; 
  T7 f7_; 
}; 
 
template <GTEST_9_TYPENAMES_(T)> 
class GTEST_9_TUPLE_(T){ 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, 
      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, 
      GTEST_BY_REF_(T8) f8): f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), 
      f5_(f5), f6_(f6), f7_(f7), f8_(f8){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), 
      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_){} 
 
  template<GTEST_9_TYPENAMES_(U)> 
  tuple(const GTEST_9_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_9_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_9_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_9_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_9_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    f4_ = t.f4_; 
    f5_ = t.f5_; 
    f6_ = t.f6_; 
    f7_ = t.f7_; 
    f8_ = t.f8_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
  T4 f4_; 
  T5 f5_; 
  T6 f6_; 
  T7 f7_; 
  T8 f8_; 
}; 
 
template <GTEST_10_TYPENAMES_(T)> 
class tuple { 
 public: 
  template<int k>friend class gtest_internal::Get; 
 
  tuple(){} 
 
  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, 
      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, 
      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, 
      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2), 
      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9){} 
 
  tuple(const tuple& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), 
      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_){} 
 
  template<GTEST_10_TYPENAMES_(U)> 
  tuple(const GTEST_10_TUPLE_(U)& t): f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), 
      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), 
      f9_(t.f9_){} 
 
  tuple&operator=(const tuple& t){ returnCopyFrom(t);} 
 
  template<GTEST_10_TYPENAMES_(U)> 
  tuple&operator=(const GTEST_10_TUPLE_(U)& t){ 
    returnCopyFrom(t); 
  } 
 
  GTEST_DECLARE_TUPLE_AS_FRIEND_ 
 
  template<GTEST_10_TYPENAMES_(U)> 
  tuple&CopyFrom(const GTEST_10_TUPLE_(U)& t){ 
    f0_ = t.f0_; 
    f1_ = t.f1_; 
    f2_ = t.f2_; 
    f3_ = t.f3_; 
    f4_ = t.f4_; 
    f5_ = t.f5_; 
    f6_ = t.f6_; 
    f7_ = t.f7_; 
    f8_ = t.f8_; 
    f9_ = t.f9_; 
    return*this; 
  } 
 
  T0 f0_; 
  T1 f1_; 
  T2 f2_; 
  T3 f3_; 
  T4 f4_; 
  T5 f5_; 
  T6 f6_; 
  T7 f7_; 
  T8 f8_; 
  T9 f9_; 
}; 
 
// 6.1.3.2 Tuple creation functions. 
 
// Known limitations: we don't support passing an 
// std::tr1::reference_wrapper<T> to make_tuple().  And we don't 
// implement tie(). 
 
inline tuple<> make_tuple(){ return tuple<>();} 
 
template <GTEST_1_TYPENAMES_(T)> 
inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0){ 
  return GTEST_1_TUPLE_(T)(f0); 
} 
 
template <GTEST_2_TYPENAMES_(T)> 
inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0,const T1& f1){ 
  return GTEST_2_TUPLE_(T)(f0, f1); 
} 
 
template <GTEST_3_TYPENAMES_(T)> 
inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2){ 
  return GTEST_3_TUPLE_(T)(f0, f1, f2); 
} 
 
template <GTEST_4_TYPENAMES_(T)> 
inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3){ 
  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3); 
} 
 
template <GTEST_5_TYPENAMES_(T)> 
inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3,const T4& f4){ 
  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4); 
} 
 
template <GTEST_6_TYPENAMES_(T)> 
inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3,const T4& f4,const T5& f5){ 
  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5); 
} 
 
template <GTEST_7_TYPENAMES_(T)> 
inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3,const T4& f4,const T5& f5,const T6& f6){ 
  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6); 
} 
 
template <GTEST_8_TYPENAMES_(T)> 
inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3,const T4& f4,const T5& f5,const T6& f6,const T7& f7){ 
  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7); 
} 
 
template <GTEST_9_TYPENAMES_(T)> 
inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3,const T4& f4,const T5& f5,const T6& f6,const T7& f7, 
    const T8& f8){ 
  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8); 
} 
 
template <GTEST_10_TYPENAMES_(T)> 
inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0,const T1& f1,const T2& f2, 
    const T3& f3,const T4& f4,const T5& f5,const T6& f6,const T7& f7, 
    const T8& f8,const T9& f9){ 
  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); 
} 
 
// 6.1.3.3 Tuple helper classes. 
 
template <typenameTuple>struct tuple_size; 
 
template <GTEST_0_TYPENAMES_(T)> 
struct tuple_size<GTEST_0_TUPLE_(T)>{ staticconst int value= 0;}; 
 
template <GTEST_1_TYPENAMES_(T)> 
struct tuple_size<GTEST_1_TUPLE_(T)>{ staticconst int value= 1;}; 
 
template <GTEST_2_TYPENAMES_(T)> 
struct tuple_size<GTEST_2_TUPLE_(T)>{ staticconst int value= 2;}; 
 
template <GTEST_3_TYPENAMES_(T)> 
struct tuple_size<GTEST_3_TUPLE_(T)>{ staticconst int value= 3;}; 
 
template <GTEST_4_TYPENAMES_(T)> 
struct tuple_size<GTEST_4_TUPLE_(T)>{ staticconst int value= 4;}; 
 
template <GTEST_5_TYPENAMES_(T)> 
struct tuple_size<GTEST_5_TUPLE_(T)>{ staticconst int value= 5;}; 
 
template <GTEST_6_TYPENAMES_(T)> 
struct tuple_size<GTEST_6_TUPLE_(T)>{ staticconst int value= 6;}; 
 
template <GTEST_7_TYPENAMES_(T)> 
struct tuple_size<GTEST_7_TUPLE_(T)>{ staticconst int value= 7;}; 
 
template <GTEST_8_TYPENAMES_(T)> 
struct tuple_size<GTEST_8_TUPLE_(T)>{ staticconst int value= 8;}; 
 
template <GTEST_9_TYPENAMES_(T)> 
struct tuple_size<GTEST_9_TUPLE_(T)>{ staticconst int value= 9;}; 
 
template <GTEST_10_TYPENAMES_(T)> 
struct tuple_size<GTEST_10_TUPLE_(T)>{ staticconst int value= 10;}; 
 
template <int k,class Tuple> 
struct tuple_element{ 
  typedeftypename gtest_internal::TupleElement< 
      k <(tuple_size<Tuple>::value), k,Tuple>::type type; 
}; 
 
#define GTEST_TUPLE_ELEMENT_(k,Tuple)typename tuple_element<k,Tuple >::type 
 
// 6.1.3.4 Element access. 
 
namespace gtest_internal{ 
 
template <> 
class Get<0>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0,Tuple)) 
  Field(Tuple& t){ return t.f0_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0,Tuple)) 
  ConstField(constTuple& t){ return t.f0_;} 
}; 
 
template <> 
class Get<1>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1,Tuple)) 
  Field(Tuple& t){ return t.f1_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1,Tuple)) 
  ConstField(constTuple& t){ return t.f1_;} 
}; 
 
template <> 
class Get<2>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2,Tuple)) 
  Field(Tuple& t){ return t.f2_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2,Tuple)) 
  ConstField(constTuple& t){ return t.f2_;} 
}; 
 
template <> 
class Get<3>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3,Tuple)) 
  Field(Tuple& t){ return t.f3_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3,Tuple)) 
  ConstField(constTuple& t){ return t.f3_;} 
}; 
 
template <> 
class Get<4>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4,Tuple)) 
  Field(Tuple& t){ return t.f4_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4,Tuple)) 
  ConstField(constTuple& t){ return t.f4_;} 
}; 
 
template <> 
class Get<5>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5,Tuple)) 
  Field(Tuple& t){ return t.f5_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5,Tuple)) 
  ConstField(constTuple& t){ return t.f5_;} 
}; 
 
template <> 
class Get<6>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6,Tuple)) 
  Field(Tuple& t){ return t.f6_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6,Tuple)) 
  ConstField(constTuple& t){ return t.f6_;} 
}; 
 
template <> 
class Get<7>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7,Tuple)) 
  Field(Tuple& t){ return t.f7_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7,Tuple)) 
  ConstField(constTuple& t){ return t.f7_;} 
}; 
 
template <> 
class Get<8>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8,Tuple)) 
  Field(Tuple& t){ return t.f8_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8,Tuple)) 
  ConstField(constTuple& t){ return t.f8_;} 
}; 
 
template <> 
class Get<9>{ 
 public: 
  template<classTuple> 
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9,Tuple)) 
  Field(Tuple& t){ return t.f9_;}  // NOLINT 
 
  template<classTuple> 
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9,Tuple)) 
  ConstField(constTuple& t){ return t.f9_;} 
}; 
 
}  // namespace gtest_internal 
 
template <int k, GTEST_10_TYPENAMES_(T)> 
GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) 
get(GTEST_10_TUPLE_(T)& t){ 
  return gtest_internal::Get<k>::Field(t); 
} 
 
template <int k, GTEST_10_TYPENAMES_(T)> 
GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T))) 
get(const GTEST_10_TUPLE_(T)& t){ 
  return gtest_internal::Get<k>::ConstField(t); 
} 
 
// 6.1.3.5 Relational operators 
 
// We only implement == and !=, as we don't have a need for the rest yet. 
 
namespace gtest_internal{ 
 
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the 
// first k fields of t1 equals the first k fields of t2. 
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if 
// k1 != k2. 
template <int kSize1,int kSize2> 
struct SameSizeTuplePrefixComparator; 
 
template <> 
struct SameSizeTuplePrefixComparator<0,0> { 
  template<classTuple1,class Tuple2> 
  staticbool Eq(constTuple1&/* t1 */,const Tuple2&/* t2 */){ 
    returntrue; 
  } 
}; 
 
template <int k> 
struct SameSizeTuplePrefixComparator<k, k>{ 
  template<classTuple1,class Tuple2> 
  staticbool Eq(constTuple1& t1,const Tuple2& t2){ 
    returnSameSizeTuplePrefixComparator<k- 1, k- 1>::Eq(t1, t2)&& 
        ::std::tr1::get<k- 1>(t1)== ::std::tr1::get<k- 1>(t2); 
  } 
}; 
 
}  // namespace gtest_internal 
 
template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)> 
inline booloperator==(const GTEST_10_TUPLE_(T)& t, 
                       const GTEST_10_TUPLE_(U)& u){ 
  return gtest_internal::SameSizeTuplePrefixComparator< 
      tuple_size<GTEST_10_TUPLE_(T)>::value, 
      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u); 
} 
 
template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)> 
inline booloperator!=(const GTEST_10_TUPLE_(T)& t, 
                       const GTEST_10_TUPLE_(U)& u){ return!(t == u);} 
 
// 6.1.4 Pairs. 
// Unimplemented. 
 
}  // namespace tr1 
}  // namespace std 
 
#undef GTEST_0_TUPLE_ 
#undef GTEST_1_TUPLE_ 
#undef GTEST_2_TUPLE_ 
#undef GTEST_3_TUPLE_ 
#undef GTEST_4_TUPLE_ 
#undef GTEST_5_TUPLE_ 
#undef GTEST_6_TUPLE_ 
#undef GTEST_7_TUPLE_ 
#undef GTEST_8_TUPLE_ 
#undef GTEST_9_TUPLE_ 
#undef GTEST_10_TUPLE_ 
 
#undef GTEST_0_TYPENAMES_ 
#undef GTEST_1_TYPENAMES_ 
#undef GTEST_2_TYPENAMES_ 
#undef GTEST_3_TYPENAMES_ 
#undef GTEST_4_TYPENAMES_ 
#undef GTEST_5_TYPENAMES_ 
#undef GTEST_6_TYPENAMES_ 
#undef GTEST_7_TYPENAMES_ 
#undef GTEST_8_TYPENAMES_ 
#undef GTEST_9_TYPENAMES_ 
#undef GTEST_10_TYPENAMES_ 
 
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_ 
#undef GTEST_BY_REF_ 
#undef GTEST_ADD_REF_ 
#undef GTEST_TUPLE_ELEMENT_ 
 
#endif  // _MFC_VER 0x0A00 
 
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值