Любопытно повторяющийся шаблон.Не найдена соответствующая функция для вызова .. шаблонный аргумент / подстановка - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь реализовать шаблон Curily Recurring Template Pattern в C ++, но не могу заставить его работать.Может кто-нибудь указать, что не так с моим кодом?

template <typename T>
struct Base {
    int x;
    Base():x(4){}
};

struct Derived: Base<Derived> {
    Derived(){}
};

template<typename H>
void dosomething(Base<H> const& b) {
    std::cout << b.x << std::endl;
}


int main() {
    Derived k();
    dosomething(k);
}

Я пытаюсь сохранить сигнатуру dosomething так, как есть, чтобы любой класс, реализующий методы в Base, можно было использовать в dosomething ().

Это ошибка, которую я получаю:

||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
In function ‘int main()’:
error: no matching function for call to ‘dosomething(Derived (&)())’
note: candidate: template<class H> void dosomething(const Base<H>&)
note:   template argument deduction/substitution failed:
note:   mismatched types ‘const Base<H>’ and ‘Derived()’

Почему я получаю эту ошибку?Разве компилятор не должен обрабатывать k как константную ссылку при вызове dosomething ()?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018
Derived k(); // function declaration

это объявление функции, которое не принимает параметров и возвращает Derived объект.И ошибка компилятора говорит вам об этом

no matching function for call to ‘dosomething(Derived (&)())
                                              ^^^^^^^^^^^^^

try

 Derived k; // instance of object
 dosomething(k);
0 голосов
/ 14 октября 2018

Это результат неприятного разбора.Это объявление:

Derived k();

является функцией.Вы должны использовать Derived k; или Derived k{};.

...