C++ C++;从常量字符到字符串的自动隐式转换

C++ C++;从常量字符到字符串的自动隐式转换,c++,string,type-conversion,implicit-conversion,C++,String,Type Conversion,Implicit Conversion,好的,我只是第一次学习模板,所以我在创建自己的模板类,模仿它的底层类型,即向量。请记住,push_back调用只调用底层向量的push_back方法 vector<string> sV; sV.push_back("ha"); //ok: converts from const char[3] to string Foo<string> fS; fS.push_back("ha"); //error: const char[3] does not

好的,我只是第一次学习模板,所以我在创建自己的模板类,模仿它的底层类型,即向量。请记住,push_back调用只调用底层向量的push_back方法

vector<string> sV;
sV.push_back("ha");       //ok: converts from const char[3] to string

Foo<string> fS;
fS.push_back("ha");      //error: const char[3] does not match the argument list
vectorsv;
sV.推回(“ha”)//确定:从常量字符[3]转换为字符串
富富财政司司长;
财政司司长:推回(“ha”)//错误:常量字符[3]与参数列表不匹配
有没有办法解决这个问题?我只是想让我的模板感觉像我在使用真实的东西一样自然


编辑:这基本上是类的主体

template <typename T> class FooPtr;
template <typename T>
class Foo{
    friend class FooPtr<T>;
public:
    Foo() {data->make_shared(vector<T>); }
#ifdef INITIALIZER_LIST
    Foo(initializer_list<T>);
#endif
    void push_back(T &t) { data->push_back(t); }
    void push_back(T &&t) { data->push_back(move(t)); }
    bool empty() { if (data->size() == 0) return true; }
    FooPtr<T> insert(size_t, T&);
    T& operator[](size_t);
    T& front();
    T& back();
    FooPtr<T> begin() { return FooPtr<T>(*this); }
    FooPtr<T> end() { return FooPtr<T>(*this, data->size()); }
    void pop_back() { data->pop_back(); }
    void pop_front() { data->pop_front; }
private:
    void check(const string&, size_t = 0);
    shared_ptr<vector<T>> data;
};
模板类FooPtr;
模板
福班{
朋友级FooPtr;
公众:
Foo(){data->make_shared(vector);}
#ifdef初始值设定项\u列表
Foo(初始值设定项列表);
#恩迪夫
void push_back(T&T){data->push_back(T);}
void push_back(T&&T){data->push_back(move(T));}
bool empty(){if(data->size()==0)返回true;}
FooPtr插件(尺寸t,t&);
T&operator[](尺寸T);
T&front();
T&back();
FooPtr begin(){return FooPtr(*this);}
FooPtr end(){return FooPtr(*this,data->size());}
void pop_back(){data->pop_back();}
void pop_front(){data->pop_front;}
私人:
无效检查(常量字符串,大小=0);
共享ptr数据;
};

您只想尝试将
常量字符*
(而不是
常量字符
字符
或其他类型的
字符
)转换为
字符串
,否则,您试图将元素映射到该元素的STL容器/数组,该元素在C++中是无稽之谈。

< P>一种方法,它应该能够接受与STD::String对象相同的字符串文本:
void foo( const std::string & arg )
因此,您的Foo::push_back必须是

void Foo::push_back( const T & arg )
正如您在这里看到的,std::vector为push_back提供了两种重载方法

一个用于常量类型,另一个用于非常量类型

第一次push_返回成功,因为std::vector提供了一个可以处理以下类型的函数

 const char *
其中const是一个神奇的词。包装器模板只提供了一个带有签名的push_-back方法

T & t
通过以下方式扩展实现应该可以解决您的问题:

void push_back (const T& t) {data->push_back(t);}

我认为你的编译器错了。我的理由如下

void push_back(std::string &t) { data->push_back(t); }           --1
void push_back(std::string &&t) { data->push_back(move(t)); }    --2
当您使用
std::string
实例化
Foo
时,生成的push_成员函数如下

void push_back(std::string &t) { data->push_back(t); }           --1
void push_back(std::string &&t) { data->push_back(move(t)); }    --2
如果参数是std::string类型的非常量左值表达式,则将选择1
如果参数是std::string类型的非常量值表达式,则将选择2

当您传递
“ha”
时,
std::string
中的用户定义转换开始,并且由于生成的
std::string(std::string(“ha”)
是一个右值,因此应选择2。即使将常量添加到1也不会导致2未被拾取


来自

模板void Foo::push_back(T)模板void Foo::push_back(move(T))的一篇不错的帖子回答了这个问题吗?@RudolphRedNose,这本来就不应该编译。Jsut for push_back(),please…Unrelated(sorta):除非我没有读对(一个明显的可能性),否则
std::move(T)
应该是
std::forward(T)
@WhozCraig你不认为这里的答案是错的吗?难道不应该为他的电话选择
void push_-back(t&&t)
?由于在重载解析期间调用了std::string的转换构造函数,因此形成的std::string是一个右值?非常神秘,请解释并使用标准英语。是的,非常感谢。但我认为OP最初的问题是失踪的康斯特。没关系,这么简单。。。鲁道夫·雷德诺斯标准图书馆文档是一个丰富的信息宝库。