使用 g++ 和 clang++ 调用 Integral 模板成员函数时出错
Error when calling an Integral template member function with g++ and clang++
我目前陷入编译错误,我无法真正识别...
这是一个最小的工作示例:
#include <iostream>
template <typename T, int R>
class a_type
{
public:
template <int N>
double segment()
{
return 42;
}
};
template <int M>
double func()
{
a_type<double, M> a;
return a.segment<1>();
}
int main(int argc, char *argv[])
{
std::cout << func<10>() << std::endl;
return 0;
}
来自 GCC 的错误消息如下:
g++ main.cpp -o main
main.cpp: In function 'double func()':
main.cpp:18:26: error: expected primary-expression before ')' token
return a.segment<1>();
^
main.cpp: In instantiation of 'double func() [with int M = 10]':
main.cpp:23:28: required from here
main.cpp:18:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
return a.segment<1>();
^
Clang 也说了类似的话:
clang++ main.cpp -o main
main.cpp:18:26: error: expected expression
return a.segment<1>();
^
所以根据 GCC 的错误信息,'a.segment' 是一个缺少括号的成员函数调用,显然会被拒绝。但这根本没有意义,因为我看不出有任何理由如此对待该表达式。
此外,如果我在第 17 行将 M 更改为任何整数,如下所示:
#include <iostream>
template <typename T, int R>
class a_type
{
public:
template <int N>
double segment()
{
return 42;
}
};
template <int M>
double func()
{
a_type<double, 58> a;
return a.segment<1>();
}
int main(int argc, char *argv[])
{
std::cout << func<10>() << std::endl;
return 0;
}
然后代码编译并产生预期的结果。
如果有人能启发我并告诉我我在这里缺少什么,我会很高兴。
编译器不知道 a.segment
是模板(它可能取决于 M
的值)。所以你要告诉它:
return a.template segment<1>();
在您的第二个示例中,它知道有关 a
类型的所有信息,因此没有问题。
编译器告诉你它有问题
a_type<double, M> a;
return a.segment<1>();
因为它无法判断成员 a
可以拥有什么,因为它是一个模板(可能专门用于 M
的某些值)。
main.cpp:18:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
return a.segment<1>();
^
如果 segment
是一个模板,它将被视为 segment<1>
。如果segment
是a
的成员变量,应该编译为a.segment < 1
。编译器怎么知道的?
您可以使用
解决这个问题
return a.template segment<1>();
我目前陷入编译错误,我无法真正识别...
这是一个最小的工作示例:
#include <iostream>
template <typename T, int R>
class a_type
{
public:
template <int N>
double segment()
{
return 42;
}
};
template <int M>
double func()
{
a_type<double, M> a;
return a.segment<1>();
}
int main(int argc, char *argv[])
{
std::cout << func<10>() << std::endl;
return 0;
}
来自 GCC 的错误消息如下:
g++ main.cpp -o main
main.cpp: In function 'double func()':
main.cpp:18:26: error: expected primary-expression before ')' token
return a.segment<1>();
^
main.cpp: In instantiation of 'double func() [with int M = 10]':
main.cpp:23:28: required from here
main.cpp:18:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
return a.segment<1>();
^
Clang 也说了类似的话:
clang++ main.cpp -o main
main.cpp:18:26: error: expected expression
return a.segment<1>();
^
所以根据 GCC 的错误信息,'a.segment' 是一个缺少括号的成员函数调用,显然会被拒绝。但这根本没有意义,因为我看不出有任何理由如此对待该表达式。 此外,如果我在第 17 行将 M 更改为任何整数,如下所示:
#include <iostream>
template <typename T, int R>
class a_type
{
public:
template <int N>
double segment()
{
return 42;
}
};
template <int M>
double func()
{
a_type<double, 58> a;
return a.segment<1>();
}
int main(int argc, char *argv[])
{
std::cout << func<10>() << std::endl;
return 0;
}
然后代码编译并产生预期的结果。
如果有人能启发我并告诉我我在这里缺少什么,我会很高兴。
编译器不知道 a.segment
是模板(它可能取决于 M
的值)。所以你要告诉它:
return a.template segment<1>();
在您的第二个示例中,它知道有关 a
类型的所有信息,因此没有问题。
编译器告诉你它有问题
a_type<double, M> a;
return a.segment<1>();
因为它无法判断成员 a
可以拥有什么,因为它是一个模板(可能专门用于 M
的某些值)。
main.cpp:18:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<' return a.segment<1>(); ^
如果 segment
是一个模板,它将被视为 segment<1>
。如果segment
是a
的成员变量,应该编译为a.segment < 1
。编译器怎么知道的?
您可以使用
解决这个问题return a.template segment<1>();