2

こんにちは:)この質問について調べてみましたが、関連する投稿がたくさんあるようですが、これまでのところ、私の問題を解決できる回答はありませんでした。この特定の質問に回答する投稿を知っている場合は、どの投稿か教えてください。この投稿を削除します。

これが私がやろうとしていることです。テンプレート引数が 1 つあるクラスがあり、そのデフォルト値はテンプレートの特殊化に対応しています。これまでのところ (以下のコードを参照)、コンパイルされません。私を悩ませているのは、2 つのテンプレート引数を使用した同様のケースと、部分的なテンプレートの特殊化がコンパイルされ、正常に動作することです.. :/

私は何を間違っていますか?


ケース 1: 2 つのテンプレート引数 (コンパイルして動作)

ヘッダ

#include <iostream>

struct Special {};

template <class T, class U = Special>
class Bird
{
public:
    inline void operator() () { sing(); }
    inline void sing() const { std::cout << "Piu piu piu" << std::endl; }

private:
    T t; U u;
};

template <class T>
class Bird<T,Special>
{
public:
    inline void operator() () {}

private:
    T t; Special u;
};

cpp

int main()
{
    Bird<double,int> a;
    Bird<double> b;

    a(); b();
}

ケース 2: 1 つのテンプレート引数 (コンパイルしない)

ヘッダ

#include <iostream>

struct Special {};

template <class U = Special>
class Bird
{
public:
    inline void operator() () { sing(); }
    inline void sing() const { std::cout << "Piu piu piu" << std::endl; }

private:
    U u;
};

template <>
class Bird<Special>
{
public:
    inline void operator() () {}

private:
    Special u;
};

cpp

int main()
{
    Bird<int> a;
    Bird b;

    a(); b();
}

エラーが表示されます: 'b' の前にテンプレート引数がありません。これを読んでくれてありがとう!:)

4

1 に答える 1

4

Birdクラステンプレートであるため、常に角かっこを使用する必要があります。関数テンプレートとは異なり、デフォルトのテンプレート引数を使用したい場合はそれらを省略できますが、山括弧はそこになければなりません:

Bird<> b;
于 2013-04-30T17:30:43.567 に答える