Я знаю, что определения классов шаблонов должны быть определены в заголовочном файле. Однако конструктор, определенный в заголовке, но вне класса, кажется незаметным для компилятора, тогда как конструктор, определенный внутри класса, работает просто отлично. Я что-то упускаю совершенно очевидное?
Это работает
#include <type_traits>
#include <iostream>
struct A {
template<typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
A(T t) {
this->t = static_cast<double>(t);
}
double t;
};
int main() {
A a(3);
std::cout << a.t << '\n';
}
Это не
#include <type_traits>
#include <iostream>
struct B {
template<typename T, typename> B(T t);
double t;
};
template<typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
B::B(T t) {
this->t = static_cast<double>(t);
}
int main() {
B b(3);
std::cout << b.t << '\n';
}
говоря
error: no matching function for call to 'B::B(int)'
B b(3);
^