我正在尝试为BOOST_CHECK_PREDICATE构建自定义谓词,其中谓词本身是模板化函数。我的例子如下:
#define BOOST_TEST_MODULE Module
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
// custom predicate
template <typename U, typename V>
bool is_close_enough(const U& a, const V& b)
{
return std::abs(a-b) < 2.0;
}
BOOST_AUTO_TEST_SUITE(boostUnitTestLearningTests)
BOOST_AUTO_TEST_CASE(Test_Templated_Predicate)
{
BOOST_CHECK_PREDICATE(is_close_enough, (4)(6));
BOOST_CHECK_PREDICATE(is_template_close_enough, (4.0)(6.5));
}
BOOST_AUTO_TEST_SUITE_END()
使用MS Visual C ++ 2010进行编译会出现以下错误:
3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'bool 提高:: test_tools :: tt_detail :: check_frwd(强的松,常量 提高:: unit_test :: lazy_ostream &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量 Arg0&amp;,const char *,const Arg1&amp;,const char *,const Arg2&amp;,const char *,const Arg3&amp;,const char *,const Arg4&amp;,const char *)':需要16个参数--10个提供3&gt;
C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见 声明'boost :: test_tools :: tt_detail :: check_frwd' 3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'布尔 提高:: test_tools :: tt_detail :: check_frwd(强的松,常量 提高:: unit_test :: lazy_ostream &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量 Arg0&amp;,const char *,const Arg1&amp;,const char *,const Arg2&amp;,const char *,const Arg3&amp;,const char *)':需要14个参数 - 10个提供3&gt; C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见 声明'boost :: test_tools :: tt_detail :: check_frwd' 3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'布尔 提高:: test_tools :: tt_detail :: check_frwd(强的松,常量 提高:: unit_test :: lazy_ostream &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量 Arg0&amp;,const char *,const Arg1&amp;,const char *,const Arg2&amp;,const char *)':期望12个参数 - 10个提供3&gt; C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见 声明'boost :: test_tools :: tt_detail :: check_frwd' 3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2896:'布尔 提高:: test_tools :: tt_detail :: check_frwd(强的松,常量 提高:: unit_test :: lazy_ostream &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量 Arg0&amp;,const char *,const Arg1&amp;,const char *)':不能使用函数 模板'bool is_close_enough(const U&amp; const V&amp;)'作为函数 参数3&gt; .. \ boost_test \ testSystem.cpp(18):看 声明'is_close_enough'3&gt; .. \ boost_test \ testSystem.cpp(42): 错误C2784:'bool boost :: test_tools :: tt_detail :: check_frwd(Pred,const 提高:: unit_test :: lazy_ostream &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量 Arg0&amp;,const char *,const Arg1&amp;,const char *)':无法演绎 '重载函数类型'的模板参数来自'重载 功能类型'3&gt;
C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见 声明'boost :: test_tools :: tt_detail :: check_frwd' 3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'布尔 提高:: test_tools :: tt_detail :: check_frwd(强的松,常量 提高:: unit_test :: lazy_ostream &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量 Arg0&amp;,const char *)':需要8个参数--10个提供
我在这里做错了什么想法?
答案 0 :(得分:3)
以下版本适用于Visual Studio 2012和g ++ 4.8.1上的Boost 1.53.0。我认为如果你想使用模板化函数,你需要明确指定模板参数。出于这个原因,我更喜欢带有仿函数的解决方案。
#define BOOST_TEST_MODULE Module
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
template <typename U, typename V>
bool is_close_enough(const U& a, const V& b)
{
return std::abs(a-b) < 2.0;
}
struct is_close_enough_functor
{
template <typename U, typename V>
bool operator()(const U& a, const V& b) const
{
return std::abs(a-b) < 2.0;
}
};
BOOST_AUTO_TEST_SUITE(boostUnitTestLearningTests)
BOOST_AUTO_TEST_CASE(Test_Templated_Predicate)
{
BOOST_CHECK_PREDICATE((is_close_enough<int,int>), (4)(6)); //extra parentheses needed to avoid a problem with the comma inside the macro
BOOST_CHECK_PREDICATE(is_close_enough_functor(), (4)(6));
BOOST_CHECK_PREDICATE(is_close_enough_functor(), (4.0)(6.5));
}
BOOST_AUTO_TEST_SUITE_END()