我现在正在编译一个开源图像处理项目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(...);
};
答案 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进行编译。