2016-12-08 13 views
0

我有使用例程這樣的一個複雜的代碼:參數包必須在這方面擴大

#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> 
     &param, 
    T value) { 
    param.reset(new T(value)); 
} 

template <typename jsParamType, size_t paramIndex, typename... jsParamTypes> 
bool testV(std::shared_ptr<typename jsParamType::Type> &param, 
      ParamInfo &paramInfo) { 
    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>...> &params, 
      std::vector<ParamInfo> &paramsInfos, 
      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>...> &params, 
      std::vector<ParamInfo> &paramsInfos) { 
    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++的作品,我得到「jsParamType:參數包必須在擴大本文中,」我真正的代碼在函數頭

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

我沒有得到任何與http://cpp.sh/8bkyb或http://rextester.com/HRK7676警告,我不編譯與Visual Studio 2015更新3 – Stargateur

+1

「我有一個問題有些代碼我沒有展示給你,下面是一些可行的代碼,這有什麼問題?「我們不是心理學家。 –

+0

沒錯,但真正的代碼是Adobe APIs,數百個文件等的混合體。 – mike

回答

0

我會在這裏發表我的經驗的解決方案,雖然我不太確定它是否是一個編譯器錯誤,但我一直認爲我是問題的原因。由於產生問題的代碼太複雜,張貼在這裏(幾十文件和依賴的),我將解釋我的兩個補丁,使得它的工作:

選項1:重命名testVtestU

選項2:保留testV名稱並將其模板參數更改爲與testU模板參數不同,重新排序就足夠了。

可能是由於某種原因混淆函數的編譯器遞歸算法?我不知道,因爲它不能被輕易複製,並且在某些情況下似乎在沒有上述兩種解決方案的情況下工作......呃,我不認爲這是一個真正的答案,但解決了我的問題。我願意接受來自我的研究員程序員的任何批評,比我更有經驗。

相關問題