Ошибка компоновщика C ++ при использовании шаблонной функции в качестве параметра шаблона - PullRequest
1 голос
/ 01 февраля 2020

Мне трудно понять, почему следующее не будет ссылаться. Ошибка (G CC 8,3):

ld: In function `Foo<&(void bar<double>())>::doThing()':
main.cpp: undefined reference to `void bar<double>()'

Код, о котором идет речь:

main. cpp:

#include "base.hpp"

// Links and runs fine if explicitly instantiated:
// Foo<bar<double>> fbd;

int main(int, char**) {
    Base<int> d;

    return 0;
}

base.hpp :

#pragma once

#include "foo.hpp"
#include "bar.hpp"

// Links fine if Base is not a template
template<typename T>
class Base {
public:
    Base() {
        Foo<bar<double>> fbd1;
        Foo<bar2> fbd2;

        fbd1.doThing(); // If doThing is not virtual and not called it links fine
        fbd2.doThing();
    }
};

foo.hpp :

#pragma once

template<void (*callMe)()>
class Foo {
public:
    // If doThing is not virtual, it links fine
    virtual void doThing() {
        callMe();
    }
};

bar.hpp :

#pragma once

#include <iostream>

// If bar is not a template, it links fine
template<typename T>
inline void bar() {
    std::cout << "hello1" << std::endl;
}

inline void bar2() {
    std::cout << "hello2" << std::endl;
}

Я явно что-то упускаю, потому что для меня это выглядит так, как будто компилятор должен уметь видеть и создавать требуемые специализации шаблона. Будем весьма благодарны за любые предложения о том, как это исправить, а также о том, почему изменения, помеченные комментариями, решают проблемы с компоновщиком.

Обновление:

Это похоже на компиляцию хорошо на лязг 7.1.0.

...