【发布时间】:2015-12-30 08:30:08
【问题描述】:
我正在编写用于绑定 SQL 参数的函数,并希望使用标签调度。所以我写了这段代码:
class OraclePreparedStatement
{
public:
template<typename T>
void bind_param(uint32_t col_index, T&& param)
{
bind_param_impl(col_index, std::forward(param),
std::is_integral<std::remove_reference_t<T>>());
}
private:
template<typename T>
void bind_param_impl(uint32_t col_index, T&& param, std::true_type)
{
statement->setNumber(col_index, oracle::occi::Number(param));
}
template<typename T>
void bind_param_impl(uint32_t col_index, T&& param, std::false_type)
{
statement->setString(col_index, std::forward(param));
}
OracleConnection::StatementWrapper statement;
};
然后我编写了以下客户端代码来测试它:
OraclePreparedStatement stmt;
auto col_index = 1;
stmt.bind_param(col_index++, 15);
stmt.bind_param(col_index++, std::string("test string"));
但是编译失败。两次调用 bind_param 方法都会导致编译错误:
错误:没有匹配的函数调用'forward(int&)'
错误:没有匹配函数调用'forward(std::basic_string&)'
为什么转发参数编译失败?
【问题讨论】:
标签: c++ templates c++14 template-meta-programming perfect-forwarding