5

我在声明一个使用的函数时遇到了一些麻烦boost::enable_if:以下代码给了我一个编译器错误:

// Declaration
template <typename T>
void foo(T t);

// Definition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}

int main()
{
    foo(12);
    return 0;
}

编译时,我收到“对 foo 的模糊调用”错误。根据 的定义enable_if,'type' typedef 对应于void条件为真时,所以据我所知,foo匹配的两个签名。为什么编译器认为它们不同,是否有正确的转发声明方法foo(最好不重复该enable_if部分)?

4

2 回答 2

3

这不仅仅是 enable_if 的问题。使用以下代码在 Visual Studio 和 gcc 上得到相同的错误:

struct TypeVoid {
  typedef void type;
};

template<typename T>
void f();

template<typename T>
typename T::type f() {
}

int main()
{
  f<TypeVoid>();
  return 0;
}

我认为主要问题是返回类型(在实例化之前)是模板函数签名的一部分。这里有更多信息。

关于您的代码,如果声明引用定义,则应同时匹配:

// Declaration       
template <typename T>       
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t);       

// Definition       
template <typename T>       
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)       
{       
}

如果声明引用了不同的函数,编译器将永远无法为int选择正确的函数,因为它们都是有效的。但是,您可以使用disable_if为int禁用第一个:

// Other function declaration
template <typename T>
typename boost::disable_if<boost::is_same<T, int> >::type foo(T t);

// Defition
template <typename T>       
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)       
{       
}
于 2010-01-13T12:34:52.590 回答
1

问题是声明和定义不匹配。

解决方案是声明应该包含完全相同的签名和enable_if位。

#include <boost/type_traits/is_same.hpp>
#include <boost/utility/enable_if.hpp>

// Declaration
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t);

// Definition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}

int main()
{
    foo(12);
    return 0;
}

这在 VC2008 上编译得很好。

于 2010-01-09T15:49:16.913 回答