こんにちは:)この質問について調べてみましたが、関連する投稿がたくさんあるようですが、これまでのところ、私の問題を解決できる回答はありませんでした。この特定の質問に回答する投稿を知っている場合は、どの投稿か教えてください。この投稿を削除します。
これが私がやろうとしていることです。テンプレート引数が 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' の前にテンプレート引数がありません。これを読んでくれてありがとう!:)