2016-07-31 63 views
0

我正在使用VS2015更新3.以下一段代碼給main()中的行提供intellisense錯誤,但是代碼編譯並運行時沒有錯誤。可能的msvc/intellisense錯誤與可變參數模板參數

#include <iostream> 
#include <tuple> 

// Template parameter classes 
template<class...> struct ComponentList {}; 
template<class...> struct Filter {}; 
template<class...> struct FilterList {}; 

template<typename ATuple, typename BTuple> 
class EntityManager; 

template<class... A, template<class> class... B> 
class EntityManager<ComponentList<A...>, FilterList<B...>> 
{ 
public: 
    template<class A> 
    void test() 
    { 
     std::cout << typeid(A).name() << std::endl; 
    } 

    // Create tuple for each filter inside filterlist 
    std::tuple<B...> tuples; 
}; 

using MyComponents = ComponentList<int, double, float>; 
using FirstFilter = Filter<int, double>; 
using SecondFilter = Filter<float>; 
using MyFilters = FilterList<FirstFilter, SecondFilter>; 

void main() 
{ 
    EntityManager<MyComponents, MyFilters> em; 
    em.test<int>(); 
} 

在main的第一行,intellisense說'不完整的類型是不允許的'。

在第二行中,智能感知給出了三個錯誤:「不完全類型是不允許的」,「類型名稱是不允許的」,以及「預期的表達」

這是在編譯器或智能感知的錯誤?

回答

0

您的代碼有一些問題。

嘗試(1),其限定EntityManager作爲

template<class... A, class... B> 
class EntityManager<ComponentList<A...>, FilterList<B...>> 

(因爲FirstFilterSecondFilter是typenames,非template<class> class參數)和(2)使用用於test()不同的模板參數(AA...類衝突)

template<class C> 
void test() 
{ 
    std::cout << typeid(C).name() << std::endl; 
} 

和(3)加入#include<typeinfo>和(4)定義int main()而不是void main()

+0

更改EntityManager的定義使智能感知錯誤消失,所以我想這是Intellisense中的一個錯誤?感謝您的其他改進。我不知道void main()僅被msvc接受,並且在使用typeid之前必須包含。 –

+0

@ M.Bijman - 我不知道Intellisense,所以我不知道它是否是Intellisense中的錯誤;我只知道你的第一個版本是錯誤的 – max66