Мне трудно понять, почему следующее не будет ссылаться. Ошибка (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.