Конструктор шаблона, определенный в том же заголовке, но вне класса, не идентифицирован - PullRequest
0 голосов
/ 15 января 2019

Я знаю, что определения классов шаблонов должны быть определены в заголовочном файле. Однако конструктор, определенный в заголовке, но вне класса, кажется незаметным для компилятора, тогда как конструктор, определенный внутри класса, работает просто отлично. Я что-то упускаю совершенно очевидное?

Это работает

#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);
          ^

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы забыли несколько вещей. Заданный по умолчанию аргумент шаблона должен быть в объявлении класса. И вам нужно будет добавить имя типа.

#include <type_traits>
#include <iostream>

struct B {
    template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> B(T t);

    double t;
};

template<typename T,
    typename>
    B::B(T t) {
    this->t = static_cast<double>(t);
}

int main() {
    B b(3);
    std::cout << b.t << '\n';
}
0 голосов
/ 15 января 2019

Да, я думаю, что это просто ошибка gcc. Подано 88864 .

Это более короткое воспроизведение, которое должно компилироваться, но не (clang принимает):

struct B {
    template<typename T, typename U> B(T t);
};

template <typename T, typename U = int>
B::B(T t) { }

B b(3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...