C 自动隐式转换从const char到字符串

C++ automatic implicit conversion from const char to string

本文关键字:const char 字符串 转换      更新时间:2023-10-16

好的,所以我只是第一次学习模板,所以我在创建自己的模板类别上模仿其基础类型的矢量。请记住,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;
};

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

void foo( const std::string & arg )

因此,您的foo :: push_back必须为

void Foo::push_back( const T & arg )

您可以在此处看到http://www.cplusplus.com/reference/vector/Vector/Vector/Vector/PUSH_BACK/std :: vector提供两种推动_back的方法,这些方法已被载荷。p>一种用于const类型和非const类型的一种。

您的第一个push_back随着std :: vector提供了一个可以处理

之类的类型的函数
 const char *

const是魔术词。您的包装器模板只提供了带有签名

的push_back方法
T & t

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

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

您只想尝试将const char*(不是const charchar或其他类型的char)转换为string,否则您正在尝试将元素映射到stl-container/array该元素在C 中是胡说八道。

我认为您的编译器是错误的。我的理由如下

使用std::string实例化Foo时,生成的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

1 如果参数是类型std :: string。
2 如果参数是类型std :: string。

通过"ha"时,用户定义的std::string中的转换启动,并且由于生产的std::string (std::string("ha"))是RVALUE,因此应选择 2 。即使在 1 中添加const>也不会导致 2 未被选中。

STL

的好帖子