Ошибка компиляции шаблона при вызове конструктора по умолчанию - PullRequest
0 голосов
/ 09 марта 2019

У меня странное поведение в отношении метода шаблона, вызывающего метод шаблона variadic, и я не могу найти, в чем проблема. Я использую Visual Studio Community 2017.

Ошибка компиляции появляется в следующем методе:

// AScene.hpp
#include "Scriptable.hpp"

template <typename T>
void AScene::initialize_(void) {
    std::shared_ptr<AGameObject> root = std::make_shared<T>();

    // ...
    root->addComponent<Scriptable>(3); // it works (3 is just a random value to bypass the default constructor, see below the Scriptable struct definition)
    root->addComponent<Scriptable>(); // error C2760 unexpected token ')', expected 'expression'
    // ...
}

Если я попытаюсь использовать конструктор по умолчанию в этом методе, у меня будет ошибка компиляции, упомянутая выше. Этот метод вызывается в производном классе, здесь:

// MyScene.cpp
#include "AScene.hpp"

void MyScene::initialize(void) {
    AScene::initialize_<Level>();
    // If I call root->addComponent<Scriptable>() directly here, its working perfectly
}

Вот реализация метода addComponent шаблона:

// AGameObject.hpp
template <typename C, typename ...Args>
void AGameObject::addComponent(Args&& ... args) {
    entity_.assign<C>(std::forward<Args>(args) ...);
}

Я не могу показать вам код assign (), поскольку он является частью библиотеки, но этот код всегда работает, когда я не вызываю его в initialize_ .

А вот мой класс Сценариев:

// Scriptable.hpp
struct Scriptable {
    Scriptable(void) = default;
    Scriptable(int i) {} // remember, used to bypass the default constructor
    // ...
};

На самом деле кажется, что компилятор просто игнорирует / не может найти конструктор по умолчанию, когда я вызываю метод addComponent в методе шаблона initialize_ . Вы знаете, что я делаю не так?

Если вам нужна дополнительная информация, пожалуйста, сообщите мне.

РЕДАКТИРОВАТЬ:

Я только что проверил реализацию assign () в библиотеке, и конструктор называется так:

C(std::forward<Args>(args) ...);

Вот ссылка, если вы хотите проверить это: https://github.com/alecthomas/entityx/blob/master/entityx/Entity.h#L648

Вот что именно сказал мне компилятор:

1>AGameObject.cpp 1>path\ascene.hpp(89): error C2760: syntax error: unexpected token ')', expected 'expression' 1>path\ascene.hpp(89): note: This diagnostic occurred in the compiler generated function 'void AScene::initialize_(void)'

...