Boost函数代码编译报错C2064:无法匹配接受1个参数的函数
Boost function报错C2064的解决思路
作为Boost及Boost function新手,参照Boost 1.80官方教程「Basic Usage」编写简化示例时,遇到错误error C2064: term does not evaluate to a function taking 1 arguments,尝试结构体重载()运算符和普通函数两种实现均报相同错误,以下是问题分析和解决方法:
问题代码
#include <stdlib.h> #include <crtdbg.h> #include <time.h> // 标准库头文件 #include <fstream> #include <sstream> #include <iostream> #include <string> #include <functional> // Boost头文件 #include <boost/filesystem.hpp> #include <boost/function.hpp> using namespace boost::filesystem; #define CASE1 0 #define CASE2 1 /**********************************************************************************/ #if CASE1 struct getLogName { std::string operator()(std::string& InputFileName) const { return InputFileName; }; }; #endif #if CASE2 std::string getLogName (std::string& InputFileName) { return (InputFileName); } #endif /**********************************************************************************/ int main (int argc, char *argv[]) { path p = current_path(); std::string PathString = p.string(); std::string FileName = PathString + "\\\\XML_LogFile.log"; #if CASE1 boost::function<std::string()> f; f = getLogName(); std::cout << f(FileName); // C2064错误行 #elif CASE2 boost::function<std::string()> f = getLogName; std::cout << f(FileName); // C2064错误行 #endif return 0; }
核心问题分析
报错的根本原因是**boost::function的类型声明与实际函数/函数对象的签名不匹配**:
- 你声明的
f是boost::function<std::string()>,表示这是一个不接受任何参数、返回std::string的函数包装器; - 但你的
getLogName无论是结构体对象还是普通函数,都需要接受一个std::string&类型的参数,调用时传递FileName就会触发参数数量不匹配的错误。
解决方法
修正
boost::function的类型签名
将boost::function<std::string()>改为boost::function<std::string(std::string&)>,明确指定该包装器接受一个std::string&参数、返回std::string。优化参数类型(可选但推荐)
把函数/运算符的参数从std::string&改为const std::string&,因为你的函数只是读取参数值,不需要修改,这样可以兼容传递const字符串的场景,避免潜在的编译警告。
修正后的代码示例
CASE1(结构体版本)
#if CASE1 boost::function<std::string(const std::string&)> f; f = getLogName(); std::cout << f(FileName); #endif // 同时修改结构体的运算符参数: struct getLogName { std::string operator()(const std::string& InputFileName) const { return InputFileName; }; };
CASE2(普通函数版本)
#elif CASE2 boost::function<std::string(const std::string&)> f = getLogName; std::cout << f(FileName); #endif // 同时修改普通函数的参数: std::string getLogName (const std::string& InputFileName) { return InputFileName; }
内容的提问来源于stack exchange,提问作者STBoerner
相关产品推荐
相关产品推荐

