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