相关疑难解决方法(0)

为什么我不能使用双冒号在命名空间中转发声明一个类?

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++ namespaces

161
推荐指数
4
解决办法
8万
查看次数

为什么重载运算符不能被定义为类的静态成员?

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更好.

c++ static-methods operator-overloading

40
推荐指数
2
解决办法
2万
查看次数