首先,让我们来重写你的榜样到的东西,是可读的,是更接近于编译,而且我们还打印出“1”或“2” say()
知道哪个函数被调用:
#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 ,所以首先,您正在尝试专门A
内的B
。这是不允许的,所以let't外移动它的A
:
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";
}
};
接下来,您使用的是相同的模板参数(T
)在这两个B
和say()
。你不需要重复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