class Namespace::Class;
Run Code Online (Sandbox Code Playgroud)
我为什么要这样做?:
namespace Namespace {
class Class;
}
Run Code Online (Sandbox Code Playgroud)
使用VC++ 8.0,编译器会发出:
错误C2653:'Namespace':不是类或命名空间名称
我假设这里的问题是编译器无法判断Namespace是类还是命名空间?但是为什么这很重要,因为它只是一个前瞻性声明?
是否有另一种方法来转发声明在某个命名空间中定义的类?上面的语法感觉就像我"重新打开"命名空间并扩展其定义.如果Class没有实际定义Namespace怎么办?这会在某个时候导致错误吗?
C++语法允许在struct/class中定义重载运算符,如:
struct X
{
void operator+(X);
}
Run Code Online (Sandbox Code Playgroud)
或者在struct/class之外,如:
void operator+(X, X);
Run Code Online (Sandbox Code Playgroud)
但不是
struct X
{
static void operator+(X, X);
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道这个决定的理由?为什么不允许第三种形式?(MSVC给出语法错误).也许这背后有一些故事?
ps同时存在第一个和第二个定义会产生歧义:
1>CppTest1.cxx
1>c:\ballerup\misc\cf_html\cpptest1.cxx(39) : error C2593: 'operator +' is ambiguous
1> c:\ballerup\misc\cf_html\cpptest1.cxx(13): could be 'void B1::operator +(B1 &)'
1> c:\ballerup\misc\cf_html\cpptest1.cxx(16): or 'void operator +(B1 &,B1 &)'
1> while trying to match the argument list '(B1, B1)'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这种模糊性比1,3或2,3更好.