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, unsigned sz>
void Array<T, sz>::pop_back()
{
arr_.pop_back();
}
template <typename T, unsigned sz>
T& Array<T, sz>::front()
{
return arr_.at(0);
}
template <typename T, unsigned sz>
T& Array<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, unsigned sz>
typename std::vector<T>::iterator Array<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中其余的初始化中都是正确的。
谢谢!