C++ - クラステンプレートメソッドの特殊化

okwaves2024-01-25  8

次のようにテンプレート メソッドを特殊化しようとしています。

template <typename X, typename Y>
class A {
public:
    void run(){};
};


template<typename Y>
void A<int, Y>::run() {}

でもわかります

main.cpp:70:17: error: nested name specifier 'A<int, Y>::' for declaration does not refer into a class, class template or class template partial specialization

特定の Y を使用して特殊化をインスタンス化していないため、特殊化がまだ完了していないことは理解していますが、どうすればよいですか?

1

関数定義を使用してクラス自体を部分的に特殊化する必要があります。

– モスクワ出身のヴラド

2020 年 9 月 4 日 21:33

----------------------------------

最初に、関数宣言を含むクラス自体を部分的に特殊化する必要があります。その後、その定義を書くことができます。関数を部分的に特殊化することはできません。

たとえば

#include <iostream>

template <typename X, typename Y>
class A {
public:
    void run()
    {
        std::cout << "How do you do?\n";
    };
};


template<typename Y>
class A<int, Y>
{
public:
    void run();
};

template<typename Y>
void A<int, Y>::run()
{
    std::cout << "Hello World!\n";
}

int main() 
{
    A<int, int>().run();
    A<double, int>().run();
    
    return 0;
}

プログラムの出力。

Hello World!
How do you do?

2

クラス A がかなり大きく、そのメソッドをオーバーライドしたいだけの場合はどうすればよいでしょうか?

– ペレンシア

2020 年 9 月 4 日 21:55

@perencia 関数を部分的に特殊化することはできません。

– モスクワ出身のヴラド

2020 年 9 月 4 日 21:58

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。