在Visual Studio 2015 RC中导致C2098和C2059的支持或相等的初始化程序

时间:2015-05-30 12:45:51

标签: c++ visual-studio c++11 compiler-errors visual-studio-2015

以下看似正确的代码无法在Visual Studio 2015 RC中编译,但有以下错误:

test.cpp(6): error C2098: unexpected token after data member 'T'
  test.cpp(11): note: see reference to class template instantiation 'Foo<int>' being compiled
test.cpp(6): error C2059: syntax error: '>'

代码:

template <typename, typename> struct X {};

template <typename T>
struct Foo
{
    X<int, T> * p = new X<int, T>;
};

int main()
{
   Foo<int> f;
}

为什么会这样,我该如何克服这个问题?

1 个答案:

答案 0 :(得分:1)

您的编译器似乎没有正确实现C ++,特别是支持或相等的初始化程序。

一个简单的解决方法是用构造函数初始化器替换brace-or-equals初始化器:

template <typename T>
struct Foo
{
    Foo() : p(new X<int, T>) {}
    //      ^^^^^^^^^^^^^^^^

    X<int, T> * p;  // no initializer
};

历史记录:原始帖子中的修复,在我用一个重现错误的最小例子替换它之前:

class ArdalanCollection : public ICollection<T>
{ 
public:
    ArdalanCollection()
    : storage(new Container_<int, T*>()), index(0) {}
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    virtual void add(T* obj) {
        storage->add(index++, obj);
    };

private:
    Container_<int, T*> *storage;   // no initializer here
    int index;
};