问题描述
AFAIK模板类或函数可以采用默认模板参数,因此出于实践考虑,我有此示例,我正在模拟适配器类Array
:
template<typename T = int,unsigned sz = 5>
class Array
{
public:
Array(T const& = T());
void push_back(T const&);
void pop_back();
T& front();
T& back();
typename std::vector<T>::iterator begin();
typename std::vector<T>::iterator end();
private:
//std::vector<T> arr_(sz,T()){}; // error: sz is not a type
std::vector<T> arr_{sz,T()};
};
template <typename T,unsigned sz>
Array<T,sz>::Array(T const& val) :
arr_(sz,val)
{}
template <typename T,unsigned sz>
void Array<T,sz>::push_back(T const& x)
{
arr_.push_back(x);
}
template <typename T,sz>::pop_back()
{
arr_.pop_back();
}
template <typename T,unsigned sz>
T& Array<T,sz>::front()
{
return arr_.at(0);
}
template <typename T,sz>::back()
{
return arr_.at(sz - 1);
}
template <typename T,unsigned sz>
typename std::vector<T>::iterator Array<T,sz>::begin()
{
return arr_.begin();
}
template <typename T,sz>::end()
{
return arr_.end();
}
int main()
{
Array<> ar_d(3.14);
for(auto const& e : ar_d)
std::cout << e << ",";
std::cout << '\n';
//Array<char*> ar("Hi there!");// works
//Array<char*,10> ar("Hi there!"); // works
Array<> ar("Hi there!"); // why this doesn't work? : invalid conversion from const char* to int
std::cout << "\ndone!\n";
}
-
为什么我不能声明成员
arr_
为什么使用std::vector<T> arr_(sz,T()){};
的原因std::vector<T> arr_{sz,T()};
有效?错误是第一个错误,因为有些烦人的解析错误? -
您会看到我类模板
Array
的所有模板参数都有默认值,而构造函数有默认值,所以为什么我不能这样写:Array<> ar("Hi there!");
?>
因为我猜想arr_
是从sz_
的默认值5
初始化而来的,所以构造方法推断出“ Hi there!”的类型。像const char*
一样,换句话说arr_
是5 const char *的向量(“ Hi there!”,“ Hi there!” ...),但我得到了错误:cannot convert from const char* to int
错误:
In function ‘int main()’: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]| note: initializing argument 1 of ‘Array<T,sz>::Array(const T&) [with T = int; unsigned int sz = 5]’
在main中其余的初始化中都是正确的。
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)