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

Possible msvc/intellisense bug with variadic template arguments

我正在使用 VS2015 Update 3。以下代码在 main() 的行中给出了智能感知错误,但是代码编译并运行没有错误。

#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 显示 'incomplete type is not allowed'。

在第二行,intellisense给出三个错误:'incomplete type is not allowed'、'type name is not allowed'和'expected an expression'

这是编译器或智能感知中的错误吗?

您的代码有一些问题。

尝试 (1) 将 EntityManager 定义为

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

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

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

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