我做了一个模板类数组:这是必要的代码:
#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
#include <cstdarg>
template< typename T >
class Array
{
public:
Array(size_t length = 0, ...);
~Array();
private:
T *m_values;
size_t m_len;
};
template< typename T>
Array< T >::Array(size_t len, ...) : m_values(0), m_len(len)
{
if(len != 0)
{
m_values = new T[len];
va_list ap;
va_start(ap, len);
for(size_t i(0); i < len; i++)
m_values[i] = va_arg(ap, T);
va_end(ap);
}
else
m_values = NULL;
}
template< typename T >
Array< T >::~Array()
{
delete[] m_values;
}
#endif // ARRAY_H
Run Code Online (Sandbox Code Playgroud)
这是我的主要
int main()
{
Array<float> a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我收到一条警告“当通过 (...) 时,float 被提升为 double,这意味着问题源是采用未知数量参数的构造函数。为什么编译器将 float 提升为 double,有吗?”一种解决它的方法,或者我必须专门针对浮点版本的类,我如何知道编译器是否也会更改其他类型......
当调用具有可变长度参数列表的函数时,可变参数将使用 C 的旧默认参数提升来传递。这些表示类型char和short int自动提升为int,类型float自动提升为double。
因此,可变参数函数绝不能接收类型为char、short int或 的参数float。