まずは、読み取り可能であるとコンパイル可能であることに近いものにあなたの例を書き換えて、我々はまた、呼び出された機能を知るためにsay()
で「1」または「2」を印刷してみましょう:
#include <iostream>
using type = int;
class A {
void call_1() {
B<type> b;
int i = 0;
b.template say(i);
}
template<class T>
struct B
{
template <typename T, typename I>
T say(I i) {
std::cout << "1\n";
return T();
}
};
template<>
struct B<void>
{
template <typename T, typename I>
void say(I i) {
std::cout << "2\n";
}
};
};
OKまず、B
をA
の内側に特化しようとしています。これは許可されていませんので、A
の外に移動しlet't:アップ
using type = int;
class A {
void call_1() {
B<type> b;
int i = 0;
b.template say(i);
}
template<class T>
struct B
{
template <typename T, typename I>
T say(I i) {
std::cout << "1\n";
return T();
}
};
};
template<>
struct A::B<void>
{
template <typename T, typename I>
void say(I i) {
std::cout << "2\n";
}
};
次に、あなたがB
とsay()
の両方で同じテンプレートパラメータ(T
)を使用しています。あなたはT
を繰り返し、それでは、それを削除できるようにする必要はありません。
using type = int;
class A {
void call_1() {
B<type> b;
int i = 0;
b.template say(i);
}
template<class T>
struct B
{
template <typename I>
T say(I i) {
std::cout << "1\n";
return T();
}
};
};
template<>
struct A::B<void>
{
template <typename I>
void say(I i) {
std::cout << "2\n";
}
};
最後に、call_1()
はA::B
の専門前に定義することはできませんので、我々はあまりにも外に移動する必要があります。
using type = int;
class A {
void call_1();
template<class T>
struct B
{
template <typename I>
T say(I i) {
std::cout << "1\n";
return T();
}
};
};
template<>
struct A::B<void>
{
template <typename I>
void say(I i) {
std::cout << "2\n";
}
};
void A::call_1() {
B<type> b;
int i = 0;
b.template say(i);
}
この今コンパイルして、あなたが望むことをしなければなりません。 call_1()
を呼び出すと、1
が印刷されます。あなたはint
void
からtype
を変更する場合:
using type = void;
それは2
を印刷します。
または別の方法で/の機能を作成することはできますか? –
Hait
sytaxは 'b.say(i);'のようになります。そして 'say'は 'template T say(I i){}'のように宣言されるべきです –
Rabbid76