Error calling templated function of non-templated class c++
我在非模板类中有一个模板化函数,如:
1 2 3 4 5 6 7 8 9 | class Foo { public: template <class T> void func(T& val) { //do work here } } |
然后,在main.cpp中,我要做的是:
1 2 3 | Foo a; std::string val; a.func<std::string>(val); //this line gives the error |
我在说"primary expression expected before"">"时出错。所以我快速搜索谷歌,发现每个人都建议一个简单的解决方案:
1 | a.template func<std::string>(val); |
唯一的问题是,我仍然得到完全相同的错误。
编辑:
我之所以没有给出完整的示例,是因为它涉及到外部库和冗长的代码,这些代码掩盖了问题,但由于上面的简化代码并不能解决问题。以下是我写的完整课程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 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 %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文件中,主要功能是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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.84和C++ 11标志设置。
编辑2:向代码中添加了字符串参数构造函数。
你的问题是:
1 | ConfigFileReader config_file_reader(std::string(argv[1])); |
被解释为一个名为
ConfigFileReader(std::__cxx11::string*) {aka ConfigFileReader(std::__cxx11::basic_string*)}'
这是因为你遇到了最麻烦的分析
使用
您有一个默认的构造函数,所以当我们使用它时:
1 | ConfigFileReader config_file_reader; |
它毫无问题地工作。
所以:
演示
更简单的是:
1 2 3 | Foo a; std::string val; a.func(val); // The compiler assumes T = std::string |