gpt4 book ai didi

c++ - 调用非模板类 C++ 的模板函数时出错

转载 作者:行者123 更新时间:2023-11-30 02:26:16 26 4
gpt4 key购买 nike

我在非模板类中有一个模板函数,如下所示:

class Foo
{
public:
template <class T>
void func(T& val)
{
//do work here
}
}

然后,在 main.cpp 中我正在做:

Foo a;
std::string val;
a.func<std::string>(val); //this line gives the error

我收到一条错误消息,提示 “'>' 之前预期的主要表达式”。因此,我快速进行了 Google 搜索,发现每个人都提出了一个简单的解决方案:

a.template func<std::string>(val);

唯一的问题是,我仍然遇到完全相同的错误。

编辑:

我没有给出完整示例的原因是因为它涉及外部库和冗长的代码,掩盖了问题,但由于上面的简化代码没有解决问题。这是我编写的完整类(class):

class ConfigFileReader
{
public:
ConfigFileReader() { }

ConfigFileReader(const std::string& config_file_path)
{
setConfigFilePath(config_file_path);
}

~ConfigFileReader() { }

void setConfigFilePath(const std::string& config_file_path)
{
try
{
root_node_ = YAML::LoadFile(config_file_path);
}
catch(const YAML::BadFile& file_load_exception)
{
printf("Error opening YAML file. Maybe the file path is incorrect\n%s", file_load_exception.msg.c_str());
}

}

template<class T>
bool getParam(const std::string& param_key, T& param_value)
{
if (root_node_.IsNull() || !root_node_.IsDefined())
{
printf("Root node is undefined or not set");
return false;
}

YAML::Node node = YAML::Clone(root_node_);

std::vector<std::string> split_name;
boost::split(split_name, param_key, boost::is_any_of("/"));

for(const std::string& str: split_name)
{
if (!node.IsMap())
{
std::cout << "Parameter was not found (Node is null)." << str << std::endl; //replace with printf
return false;
}

node = node[str];
}

if (node.IsNull() || !node.IsDefined())
{
std::cout << "Parameter was not found (Node is null/undefined)." << std::endl;
return false;
}

try
{
param_value = node.as<T>();
return true;
}
catch (const YAML::TypedBadConversion<T>& type_conversion_exception)
{
std::cout << "Error converting param value into specified data type" << std::endl;
std::cout << type_conversion_exception.msg << std::endl;
}

return false;
}

private:
YAML::Node root_node_;
};

然后,在一个单独的cpp文件中是main函数

int main(int argc, char** argv)
{
if (argc != 2)
{
printf("Incorrect number of arguments given");
return EXIT_FAILURE;
}

printf("Config file path: %s", argv[1]);

ConfigFileReader config_file_reader(std::string(argv[1]));

std::string param_out;

bool success = config_file_reader.template getParam<std::string>("controller/filepath", param_out); //<-- ERROR HERE

return EXIT_SUCCESS;
}

编译器: gcc 4.8.4,编译时设置了 c++11 标志。

编辑 2:在代码中添加了字符串参数构造函数。

最佳答案

你的问题是:

ConfigFileReader config_file_reader(std::string(argv[1]));

被解释为名为 config_file_reader 的函数的前向声明,该函数接受指向字符串的指针。查看错误信息:

ConfigFileReader(std::__cxx11::string*) {aka ConfigFileReader(std::__cxx11::basic_string*)}'

这是因为你遇到了The most vexing parse

使用 ConfigFileReader config_file_reader(std::string{argv[1]}); 为编译器更好地消除您打算构造对象的歧义。然后编译器将开始提示您缺少接受字符串的构造函数!

确实有一个默认构造函数,所以当我们使用它时:

ConfigFileReader config_file_reader;

它工作没有问题。

所以:

  1. ConfigFileReader 定义一个接受 string 的构造函数,然后
  2. 以代码明确的方式调用它

Demo

关于c++ - 调用非模板类 C++ 的模板函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43046751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com