c++ - 类对象作为模板函数参数
问题描述
我对模板有疑问,我对它们的了解绝对有限。所以我有一个类应该存储一些信息:
class Q
{
int integer;
int fractional;
public:
constexpr Q(int i,int f) : integer(i),fractional(f) {}
int get_i() const {return this->integer;}
int get_f() const {return this->fractional;}
constexpr int get_w() {return this->integer + this->fractional;}
friend ostream& operator<<(ostream& os, const Q& q){ os << "Q" << q.integer << "." << q.fractional << " (w:" << q.integer + q.fractional << ")"; return os; }
};
然后我有我的模板函数。这只是一个例子,但它表明了这一点:
template <Q input_q, Q output_q,const unsigned int X_0_evaluated_bit> void calculate_stuff (const int max_iterations)
{
std::array<Q,input_q.get_w()> input_queue_q;
}
Q
最后是生成我想在函数中使用的常量对象的主要(我正在使用 SystemC 库)
int sc_main(int argc, char *argv[])
{
constexpr Q Q1_i = Q(1,10);
constexpr Q Q1_o = Q(0,11);
// Number of bits used to address the LUT for the initial value
const unsigned int X_0_evaluated_bit = 5;
// Number of iteration for the Newton-Raphson
const int max_iterations = 2;
calculate_stuff <Q1_i,Q1_o,X_0_evaluated_bit> (max_iterations);
return 0;
}
如果我尝试编译,我会收到以下错误消息:
check_ac_one_over.cpp:31:13: error: ‘class Q’ is not a valid type for a template non-type parameter
template <Q input_q, Q output_q,const unsigned int X_0_evaluated_bit> void calculate_stuff (const int max_iterations)
^
check_ac_one_over.cpp:31:24: error: ‘class Q’ is not a valid type for a template non-type parameter
template <Q input_q, Q output_q,const unsigned int X_0_evaluated_bit> void calculate_stuff (const int max_iterations)
^
check_ac_one_over.cpp: In function ‘void calculate_stuff(int)’:
check_ac_one_over.cpp:33:31: error: template argument 2 is invalid
std::array<Q,input_q.get_w()> input_queue_q;
^
check_ac_one_over.cpp:33:46: error: invalid type in declaration before ‘;’ token
std::array<Q,input_q.get_w()> input_queue_q;
^
check_ac_one_over.cpp: In function ‘int sc_main(int, char**)’:
check_ac_one_over.cpp:102:64: error: no matching function for call to ‘calculate_stuff(const int&)’
calculate_stuff <Q1_i,Q1_o,X_0_evaluated_bit> (max_iterations);
^
check_ac_one_over.cpp:102:64: note: candidate is:
check_ac_one_over.cpp:31:76: note: template<<typeprefixerror>input_q, <typeprefixerror>output_q, unsigned int X_0_evaluated_bit> void calculate_stuff(int)
template <Q input_q, Q output_q,const unsigned int X_0_evaluated_bit> void calculate_stuff (const int max_iterations)
^
check_ac_one_over.cpp:31:76: note: template argument deduction/substitution failed:
check_ac_one_over.cpp:102:64: note: invalid template non-type parameter
calculate_stuff <Q1_i,Q1_o,X_0_evaluated_bit> (max_iterations);
^
check_ac_one_over.cpp:102:64: note: invalid template non-type parameter
make: *** [check_ac_one_over.o] Error 1
现在我不确定我想做的事情是否可行。有没有人有一些想法我怎样才能让它工作?
干杯,
斯特凡诺
解决方案
有没有人有一些想法我怎样才能让它工作?
我想这不是一个好主意,但是...
错误信息很清楚:
'class Q' 不是模板非类型参数的有效类型
但是,在您的示例中,您没有使用完整的Q
对象:您使用input_q.get_w()
.
所以我想你可以作为模板参数而不是完整Q
对象传递,但只有返回的值get_w()
是一个int
所以是一个有效的模板非类型参数。
某事(仅使用第一个模板参数;不知道如何使用另一个)
template <int input_dim>
void calculate_stuff (const int max_iterations)
{
std::array<Q, input_dim> input_queue_q;
}
你可以打电话(算上那个Q1_i
和get_w()
是constexpr
)
calculate_stuff<Q1_i.get_w()> (1);
但请注意
1)get_w()
应该也const
,不仅constexpr
constexpr int get_w() const {return this->integer + this->fractional;}
因为constexpr
方法不是自动的const
(从 C++14 开始),但constexpr
对象也是(所以如果没有定义const
就不能使用)get_w()
const
Q
2)如果你想要一个如下的数组
std::array<Q, input_dim> input_queue_q;
该Q
类型需要一个没有参数的构造函数;例如将默认值添加到您的构造函数
constexpr Q(int i = 0, int f = 0) : integer(i),fractional(f) {}
推荐阅读
- c++ - 使用线程时的未知类型名称
- python - Spyder 网络抓取工具不会转到新网址
- javascript - 在页面上多次使用自动完成时从自动完成中获取数据
- html - 在没有 JavaScript 的情况下向 DIV 添加悬停效果(纯 CSS)
- java - 为重复搜索选项创建循环的问题,为搜索查询事件添加下划线的建议
- python - 读数计数器
- swiftui - 如何防止 Text 扩展 VStack 的宽度
- python - 为什么pyparsing的可选总是返回一个列表
- python - Tkinter 在定义的坐标处删除所有移动对象
- python - 关于 Python 中的矩阵向量运算