【发布时间】:2014-01-30 06:10:34
【问题描述】:
好吧,我只是第一次学习模板,所以我正在玩弄创建自己的模板类来模仿它的底层类型,即向量。请记住,对 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;
};
【问题讨论】:
-
template
void Foo::push_back(T) template void Foo::push_back(move(T)) 有答案吗? -
@RudolphRedNose,一开始就不应该编译。
-
请输入 push_back()...
-
不相关(排序):除非我没看错(很可能),否则
std::move(t)应该是std::forward<T>(t)。 -
@WhozCraig 你不认为这里的答案是错误的吗?不应该选择
void push_back(T &&t)接听电话吗?因为在重载解析期间调用了 std::string 的转换构造函数,因此形成的 std::string 是一个右值?
标签: c++ string type-conversion implicit-conversion