我使用以下代码进行原型设计。
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
template<class container, class value> class Add {
public:
Add(){};
~Add(){};
void add_value(container& cont, value& val){
std::for_each(cont.begin(), cont.end(), [&val](value& v){v +=val;});
};
};
int main(int argc, char const *argv[])
{
Add<std::vector<std::string>, std::string> a;
std::vector<std::string> vec = {"a", "b", "c", "d"};
std::string foo= "1";
a.add_value(vec, foo); // compiles fine
a.add_value(vec, "1"); // generates an error
return 0;
}
我收到了以下错误
template.cpp:28:25: error: invalid initialization of non-const reference of type ‘std::__cxx11::basic_string<char>&’ from an rvalue of type ‘std::__cxx11::basic_string<char>’
为什么无法将char*
传递给string
参数?
据我所知,为了将char*
转换为std::string
,将执行隐式转换,结果将传递给函数。
答案 0 :(得分:4)
您将add_value
定义如下:
void add_value(container& cont, value& val)
如果字符串是非const引用,编译器希望此引用指向其他位置的可修改变量。
但是,当您传递const char[]
时,即使此类型可以转换为字符串(如果它将编译),它也会在运行中完成,并且字符串不可修改。实际上,char*
也不可修改。这就是你的代码无法编译的原因。
您可以将您的功能定义如下,它可以工作:
void add_value(container& cont, const value& val)