我有一个像这样的类来根据类型调用函数。我尝试编译它,但出现错误 error C2059 syntax error : 'template'
class A
{
call_1()
{
B<type> b;
b.template say(i);
}
template<class T>
struct B
{
template <typename T, typename I>
T say(I i) {
return word;
}
};
template<>
struct B<void>
{
template <typename T, typename I>
void say(I i) {
/**/
}
};
}
我做错了什么?
最佳答案
首先,让我们将您的示例重写为可读且更接近可编译的内容,我们还在 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";
}
};
};
好的,那么首先,您要尝试在 A
内部特化 B
。这是不允许的,所以不要将它移到 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";
}
};
接下来,您将在 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
。如果将 type
从 int
更改为 void
:
using type = void;
它将打印2
。
关于c++ - 从内部类调用模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487676/