【问题标题】:error C2064 for Windows but not for Linux错误 C2064 适用于 Windows 但不适用于 Linux
【发布时间】:2016-03-01 13:30:29
【问题描述】:

我现在正在编译一个开源图像处理项目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_ )  )>
    {};

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

注意事项:

interanl::make_&lt;T&gt;::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(...);
      };

【问题讨论】:

  • VS 2010 C++ 编译器在模板方面相当不足。您可能想检查一个较新的版本,其中模板支持已大大改进。
  • 请提供完整的错误消息,包括正在编译的实际 is_a 调用以及其他所有内容。
  • 如果不查看所涉及的所有模板的完整定义,就不可能回答这个问题:bool_, internal::helper_is_a_ 显然是 selector() 方法。
  • ::selector(internal::make_::ptr()) > 这看起来不对,因为选择器应该是一种类型,而不是一种方法.
  • 您能否显示为您的 Windows 编译和 Linux 编译传递给编译器的标志?

标签: c++ windows


【解决方案1】:

这可以工作(用 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 视为基类或成员时立即对其进行求值。 您的原始代码使用 VS2013 C++11 编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2021-05-02
    • 2017-06-14
    • 2011-06-15
    • 2021-10-27
    相关资源
    最近更新 更多