我有一个使用这些例程的复杂代码:
#include <memory>
#include <iostream>
#include <vector>
template <typename T> class C {
public:
typedef T Type;
};
class ParamInfo {
public:
bool value;
};
template <typename T>
void testR(
std::shared_ptr<typename std::enable_if<
std::is_same<int, T>::value || std::is_same<double, T>::value, T>::type>
¶m,
T value) {
param.reset(new T(value));
}
template <typename jsParamType, size_t paramIndex, typename... jsParamTypes>
bool testV(std::shared_ptr<typename jsParamType::Type> ¶m,
ParamInfo ¶mInfo) {
std::cout << param << "\n";
(*param)++;
testR<typename jsParamType::Type>(param, 10);
std::cout << typeid(param).name() << " ++ --> " << *param << std::endl;
paramInfo.value = true;
return true;
}
template <typename... jsParamType, size_t... paramIndex>
bool testU(std::tuple<std::shared_ptr<typename jsParamType::Type>...> ¶ms,
std::vector<ParamInfo> ¶msInfos,
std::index_sequence<paramIndex...>) {
bool r[] = {true,
testV<jsParamType, paramIndex, jsParamType...>(
std::get<paramIndex>(params), paramsInfos[paramIndex])...};
bool res = true;
for (size_t i = 0; i < sizeof...(jsParamType) + 1 && res == true; i++)
res &= r[i];
return res;
}
template <typename... jsParamType>
bool testU(std::tuple<std::shared_ptr<typename jsParamType::Type>...> ¶ms,
std::vector<ParamInfo> ¶msInfos) {
return testU<jsParamType...>(
params, paramsInfos, std::make_index_sequence<sizeof...(jsParamType)>{});
}
template <typename... jsParamType> void test() {
std::tuple<std::shared_ptr<typename jsParamType::Type>...> params =
std::make_tuple(std::shared_ptr<typename jsParamType::Type>(
new typename jsParamType::Type())...);
std::vector<ParamInfo> paramsInfos(sizeof...(jsParamType));
bool ret = testU<jsParamType...>(params, paramsInfos);
std::cout << ret << "\n";
}
int main() {
// your code goes here
test<C<int>, C<double>>();
test<>();
return 0;
}
虽然这段代码在MSVC / GNUC ++下编译和工作,但我得到&#34; jsParamType:参数包必须在此上下文中扩展&#34;我在函数头的实际代码
template<typename jsParamType, size_t paramIndex, typename... jsParamTypes>
bool testV(std::shared_ptr<typename jsParamType::Type>& param, ParamInfo& paramInfo)
此参数std::shared_ptr<typename jsParamType::Type>& param
我试着知道是什么原因。
在某些情况下是否需要std::forward
?
我知道它并不多,但真正的代码发布起来很复杂。
在我的测试中,在真实代码中,没有std::shared_ptr
我没有得到错误,因此它必须与某些模板评估或参数扣除相关。
答案 0 :(得分:0)
我会在这里发布我的经验解决方案,虽然我不确定它是否是编译器错误,但我总是把我当成问题的原因。由于产生问题的代码太复杂而无法发布(数十个文件和依赖项),我将解释我的两个修复程序,使其工作:
选项1:将testV
重命名为testU
选项2:保留testV
名称并更改其模板参数,只是与testU
模板参数不同,重新排序就足够了。
可能是因某些原因混淆了函数的编译器递归算法?我不知道,因为它不能轻易复制,在某些情况下似乎没有上面的两个解决方案......嗯,我不认为这是一个真正的答案,但解决了我的问题。我对来自我的同事程序员的批评持开放态度,比我更有经验。