У меня странное поведение в отношении метода шаблона, вызывающего вариативный метод шаблона, и я не могу найти, в чем проблема. Я использую 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:
// 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)'
assign
, как вы можете ожидать здесь какой-либо помощи? Что касается кода, который вы показали, нет вызова конструктораScriptable
. - person super   schedule 09.03.2019Scriptable() = default
вместоScriptable(void) = default
? - person max66   schedule 09.03.2019assign
. - person Stéphane G.   schedule 09.03.2019AScene.hpp
отсутствует#include "AGameObject.hpp"
. Вот — mcve. Подсказка заключается в том, что компилятор понятия не имеет, чтоaddComponent
является шаблоном, поэтому он видит((root->addComponent) < Scriptable) > ()
(т. е.<
и>
являются операторами "меньше" и "больше"). - person Oktalist   schedule 09.03.2019