VC++模板编译器错误 C2244:无法将函数定义与现有声明匹配
我在使用 Visual Studio 2010 时遇到了编译器错误,我已将其简化为以下代码:
template <int i> struct A
{
typedef int T;
};
template<int i>
struct B
{
static const int i = i; // <-- this seems to cause the problem
typename A<i>::T F();
};
template<int i>
typename A<i>::T B<i>::F() { return B<i>::i; }
此代码产生此错误:
repro.cpp(15): error C2244: 'B<i>::F' : unable to match function definition to an existing declaration
repro.cpp(12) : see declaration of 'B<i>::F'
definition
'A<i>::T B<i>::F(void)'
existing declarations
'A<i>::T B<i>::F(void)'
如果在 struct B
中声明 i
删除后编译器错误就会消失。我相信这是因为 F
返回类型的模板参数绑定到 B
中的静态成员 i
而不是 B< /code> 的模板参数。当
i
的值相同时,为什么 F
的返回类型会“不同”?这是一个错误吗?
我还应该提到,如果函数被声明为内联,错误就会消失。
I've encountered a compiler error using Visual Studio 2010 which I've reduced down to the following code:
template <int i> struct A
{
typedef int T;
};
template<int i>
struct B
{
static const int i = i; // <-- this seems to cause the problem
typename A<i>::T F();
};
template<int i>
typename A<i>::T B<i>::F() { return B<i>::i; }
This code produces this error:
repro.cpp(15): error C2244: 'B<i>::F' : unable to match function definition to an existing declaration
repro.cpp(12) : see declaration of 'B<i>::F'
definition
'A<i>::T B<i>::F(void)'
existing declarations
'A<i>::T B<i>::F(void)'
If the declaration for i
in struct B
is removed the compiler error goes away. I believe it's because the template parameter for the return type of F
is binding to the static member i
within B
instead of B
's template argument. Why do the return types for F
'differ' when the value for i
is the same? Is this a bug?
I should also mention that if the function is declared inline the error goes away.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题是您在同一范围内两次声明相同的名称。如果您重命名 static const int i 或模板参数,它应该可以工作。
The problem is you are declaring the same name twice in the same scope. If you rename the static const int i, or the template parameter it should work.