错误C2064 for Windows但不适用于Linux

时间:2015-11-27 10:53:26

标签: c++ windows

我现在正在编译一个开源图像处理项目olena。它是一个很棒的图像处理库,我已经成功地为Linux编译了它(4.6.3)。由于我习惯使用Windows,我也尝试使用Visual Studio 2010在Windows中编译项目。但是,当我编译它时,我有C2064错误消息:

Error   1   error C2064: term does not evaluate to a function taking 0 arguments    C:\olena-2.1\olena-2.1\milena\mln\metal\is_a.hh 101

在出现错误消息后,我想出了这段代码:

 /*!
      \internal
      \brief "is_a" check.

      Check whether T inherits from _CONCEPT_ M.
    */
    template <typename T, template <class> class M>
    struct is_a : bool_<( 
            sizeof( internal::helper_is_a_< T, M >::selector(internal::make_< T >::ptr()) ) //**ERROR**
              ==
              sizeof( internal::yes_ )  )>
    {};

这是一个非常短的代码片段,但我不知道错误可能来自哪里。有任何想法吗?谢谢。

注意:

interanl::make_<T>::ptr()的定义如下:

  template <typename T>
    inline
    T*
    make_<T>::ptr() // This piece of code is defined to prevent an ICE from g++-2.95.
    {
      T* tmp;
      return tmp;
    }

 template <typename T>
      struct make_
      {
    static T* ptr();
      };

iternal::helper_is_a_的定义是

 template <typename T, template <class> class M>
      struct helper_is_a_
      {

    template<class V>
    static yes_ selector(M<V>*);
    static no_  selector(...);
      };

1 个答案:

答案 0 :(得分:0)

这样可行(使用vs2008测试)。

template <typename T, template <class> class M>
struct is_a
{
  static const bool value = bool_<( sizeof( internal::helper_is_a_< T, M >::selector(internal::make_< T >::ptr()) )
        ==
        sizeof( internal::yes_ )  )>::value;
};

无论出于何种原因,当它将sizeof视为基类或成员时,它会立即尝试评估sizeof。 您的原始代码使用VS2013 C ++ 11进行编译。