C ++自动从const char到string的隐式转换

时间:2014-01-30 06:10:34

标签: 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 match the argument list

我有办法解决这个问题吗?我只是希望我的模板能够像使用真实的东西一样自然。


编辑:这基本上是班级的主体

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;
};

4 个答案:

答案 0 :(得分:6)

应该能够接受与std :: string对象相同的字符串文字的方法必须具有签名

void foo( const std::string & arg )

因此,你的Foo :: push_back必须是

void Foo::push_back( const T & arg )

答案 1 :(得分:2)

正如你在这里看到的http://www.cplusplus.com/reference/vector/vector/push_back/,std :: vector提供了两种重载的push_back方法。

一个用于const类型和非const类型。

你的第一个push_back成功,因为std :: vector提供了一个可以处理像

这样的类型的函数
 const char *

其中const是神奇的词。您的包装器模板只提供带签名

的push_back方法
T & t

使用以下内容扩展您的实施应解决您的问题:

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

答案 2 :(得分:0)

您希望仅尝试将const char*(非const charchar或其他类型的char)转换为string,否则您正在尝试将元素映射到该元素的STL容器/数组,这在C ++中是无意义的。

答案 3 :(得分:0)

我认为你的编译器是错误的。我的推理如下

当您使用Foo实例化std::string时,生成的push_back成员函数将如下所示

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类型的非const左值表达式,将选择

1
如果参数是std :: string类型的非const rvalue表达式,则会选择 2

当您通过"ha"时,std::string中的用户定义转化会启动,并且由于生成的std::string (std::string("ha"))是左值,因此应选择 2 。即使将 1 添加到const也不会导致 2 被选中。

来自STL

的精彩帖子