C ++ stati c функция в шаблонном классе - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу разместить функцию stati c внутри класса шаблона по организационным причинам, а не потому, что функция stati c нуждается в параметре шаблона. Например:

#include <iostream>

template<typename T>
struct Test {
    void print() const {
        std::cout << var << std::endl;
    }
    T var;

    template<typename G>
    static void sayHi(G&& g) {
        std::cout << "Hi! from " << g.print() << std::endl;
    }
};

int main() {
    Test<std::string> t1{"Goodbye"};
    t1.print();
    Test::sayHi(t1);
}

Однако я получаю следующую ошибку:

error: 'Test' is not a class, namespace, or enumeration
    Test::sayHi();

Я понимаю, почему это ошибка. Есть ли другой способ, которым я могу попытаться осуществить это? У кого-нибудь есть альтернативы?

Я знаю следующие работы, однако я не хочу указывать параметр шаблона для этого вызова stati c, особенно потому, что этот метод stati c на самом деле не в параметре шаблона T вообще.

Test<std::string>::sayHi(t1);

1 Ответ

0 голосов
/ 07 апреля 2020

Вот вам

#include <iostream>
#include <string>

template<typename T>
struct Test {
    void print() const {
        std::cout << var << std::endl;
    }
    T var;

    template<typename G>
    static void sayHi(G&& g) {
        std::cout << "Hi! from ";
        g.print();
        std::cout << std::endl;
    }
};

int main() {
    Test<std::string> t1{"Goodbye"};
    t1.print();
    Test<std::string>::sayHi( std::move( t1 ) );
}

Для начала функция sayHi была определена неправильно. И вам нужно специализировать класс, когда вызывается функция stati c, и использовать std :: move для lvalue, чтобы преобразовать его в rvalue.

...