gpt4 book ai didi

c++ - 无法从类型 x 转换为类型 x?

转载 作者:可可西里 更新时间:2023-11-01 15:23:44 26 4
gpt4 key购买 nike

编译时(Microsoft Visual C++ 2005 Express)这段代码:

struct A
{
template< typename T > static A Foo( void ) { return A(); }
struct S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
A ( *m_funcFoo )( void );
};
};

int main(int argc, char* argv[])
{
A::S::GetInstance< int >();
}

我收到 C2440 错误:

'=': cannot convert from 'A (__cdecl *)(void)' to 'A (__cdecl *)(void)'

这对我来说没有意义。错误文本中命名的两种类型显然是相同的。另外,将Foo的返回值改成int,也不会出现这样的错误。

这是错误还是我做错了什么?

编辑:所以,如果这是一个错误,有谁知道如何解决这个问题?也许通过使用类型转换?我需要这段代码来编译...

最佳答案

这是一个编译器错误。 VC++ 正在做一些非常奇怪的事情。

例如,这会生成一个非常不同的错误消息:

struct A
{
template< typename T > static struct A Foo( void ) { return A(); }
struct S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
A ( *m_funcFoo )( void );
};
};

sourceFile.cpp(5) : error C3856: 'A::Foo': class is not a class template

这有效:

struct X {};

struct A
{
template< typename T > static X Foo( void ) { return X(); }
struct S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
X ( *m_funcFoo )( void );
};
};

很明显它被名称 A 弄糊涂了,它应该指的是基类。

添加 typedef 没有帮助,struct A 的前向声明也没有帮助,将名称限定为 ::Astruct A.

奇怪的是,VC++7 编译得很好。

解决方法:像这样更改它:

struct A
{
template< typename T > static A Foo( void ) { return A(); }

struct S;
};

struct A::S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
A ( *m_funcFoo )( void );
};

反转结果,现在 VC++8 编译正常,而 VC++7 生成相同的错误消息。

我认为不完整的类型和完成后的相同类型之间存在类型标识问题。

所有测试都使用 Dinkumware Multi-Compiler Test Tool 运行

关于c++ - 无法从类型 x 转换为类型 x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com