模板类默认模板参数与默认函数参数

时间:2020-11-05 12:11:39

标签: c++ default-arguments template-classes

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中其余的初始化中都是正确的。

谢谢!

0 个答案:

没有答案