gpt4 book ai didi

c++ - 在命名空间中转发定义类?

转载 作者:太空狗 更新时间:2023-10-29 21:49:35 25 4
gpt4 key购买 nike

以下代码片段无法使用 Visual Studio 2010 进行编译,但 GCC 喜欢它:

namespace Test { 
class Baz;
// Adding class Bar; here and removing the class below makes it work
// with VC++, but it should work like this, shouldn't it?
void Foo (Baz& b, class Bar& c);
}

namespace Test {
class Bar
{
// Making this method non-template works
template <typename T>
static void Lalala ()
{
}
};
}

int main ()
{
}

我是在做傻事还是这是一个有效的编译器错误?我得到的错误是:错误 C2888:“void Bar::Foo(void)”:无法在命名空间“Test”中定义符号

它使用 GCC 4.5.1 编译:http://ideone.com/7sImY

[编辑] 明确地说,我想知道这是否是有效的 C++(如果是,为什么不是)——编译它的变通方法很好,但不是这个问题的一部分。

最佳答案

嗯,我在 codepad.org试过了也可以编译,但我不确定它应该(不是那么精通 C++ 编译器功能)!

解决方法:前向声明 Bar或者你必须定义 Bar在你做之前 Foo .换句话说,这在 MSVC 中编译:

namespace Test 
{
class Baz;
class Bar;// also forward-declare Bar
void Foo (Baz& b, class Bar& c);
}

namespace Test
{
class Bar
{
template <typename T>
static void Foo ()
{
}
};
}

int main(void)
{

return 0;
}

更新:我认为这可能已经是向 Microsoft 报告的错误...这看起来非常接近:http://connect.microsoft.com/VisualStudio/feedback/details/99218/invalid-error-c2888-when-a-class-is-defined-after-it-is-declared

Microsoft 引用的解决方法:

A stand-alone forward declaration consists of an elaborated type specifier followed by a semicolon.

insert the declaration

class C2888;

before the declaration of foo(C2888o, C2888).

关于c++ - 在命名空间中转发定义类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070233/

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