我有以下代码使用模板和数组维度作为模板非类型参数
template<int n> double f(double c[n]);
...
double c[5];
f<5>(c); // compiles
f(c); // does not compile
编译器是否应该能够在没有显式模板参数的情况下实例化第二个f?我正在使用g ++ 4.1
答案 0 :(得分:30)
使用引用时有效:
template<size_t n> double f(double (&c)[n]);
答案 1 :(得分:1)
不幸的是没有,因为当你将double c[5]
传递给f(),或者任何数组传递给任何采用数组的函数时,你都会丢失大小信息。你只是传递一个指针。
编辑:但请参阅gf的答案以获得解决方法。
答案 2 :(得分:0)
不,因为在不同的电话中,争论可能来自任何地方。编译器肯定无法在运行时追逐你的指针。
编辑:顺便说一句,这对我有用,但需要-std = c ++ 0x(我正在使用gcc 4.4)
#include <iostream>
template <int n>
struct T
{
T&
operator=(double const cc[n])
{
c = cc;
return *this;
}
const double
operator[](int const &i)
{
return c[i];
}
double c[n];
};
template<int n>
double
f(T<n> & x)
{
return x[n-1];
}
int
main()
{
T<5> t5 = {10, 20, 30, 40, 50};
T<3> t3 = {100, 200, 300};
std::cout << f(t5) << std::endl;
std::cout << f(t3) << std::endl;
return 0;
}
答案 3 :(得分:-1)
这可以帮助您解决更大的问题(无论可能是什么)。这将允许您在编译时查询数组的大小/类型。
template < typename T_, unsigned N_ >
class many {
public:
typedef T_ T;
enum { N = N_ };
T array[N];
};
贾斯汀