可变参数模板参数可能存在msvc / intellisense错误

时间:2016-07-31 19:01:27

标签: c++ c++11 visual-c++ intellisense

我正在使用VS2015 Update 3.以下代码在main()中的行上给出了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>();
}

在主要的第一行,intellisense说“不允许不完整的类型”。

在第二行,intellisense给出了三个错误:“不允许不完整的类型”,“不允许类型名称”和“预期表达式”

这是编译器还是intellisense中的错误?

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

尝试(1)将EntityManager定义为

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

(因为FirstFilterSecondFilter是类型名称,非template<class> class参数)和(2)使用test()的不同模板参数(A冲突课程A...

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

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