2011-06-02 27 views
7
namespace X 
{ 
    void* operator new (size_t); 
} 

給出錯誤消息:運營商新的內部命名空間

error: ‘void* X::operator new(size_t)’ may not be declared within a namespace 

它是一個gcc compiler bug?在較舊的gcc版本中,它似乎正在工作。 任何想法,爲什麼不允許?

使用案例: 我想只允許自定義operator new/delete的班,想禁止全球new/operator。而不是鏈接器錯誤,很容易發現編譯器錯誤;所以我編碼:

​​

這適用於舊版本的gcc,但不適用於新的。

+0

http://stackoverflow.com/questions/1568168/testoperator-new的重複? – Nemo 2011-06-02 06:01:55

+0

如果您想爲類使用自定義運算符,請使用該自定義運算符爲它們提供一個通用基類。 – sharptooth 2011-06-02 06:10:26

回答

6

@銳齒的答案更有意義,如果我們考慮標準的這一部分:

3.7.3.1分配功能[basic.stc.dynamic.allocation]

[.. ]分配函數應該是類成員函數或全局函數;如果在全局作用域以外的名稱空間作用域中聲明瞭分配函數,或者在全局作用域中將其聲明爲靜態,那麼該程序會形成錯誤。 [..]

上述限制可能是因爲@ sharptooth的答案指出的原因。

8

這是不允許的,因爲它沒有任何意義。例如,你有以下

int* ptr = 0; 

namespace X { 
    void* operator new (size_t); 
    void operator delete(void*); 
    void f() 
    { 
     ptr = new int(); 
    } 
} 

void f() 
{ 
    delete ptr; 
    ptr = 0; 
} 

現在應該如何ptrdelete d - 與全局命名空間operator delete()或與一個特定的namespace X? C++沒有辦法推斷出這一點。

+0

我發佈了一個用例。也可以有其他用例,也可以只在'namespace'範圍內使用它。 – iammilind 2011-06-02 05:56:41

+0

查看關於[g ++ bug報告引用]的討論(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13903)。這是標準禁止的。 – Nemo 2011-06-02 06:00:10

+0

+1,同意@sharptooth(我之前曾想到過這個問題;但是我用這個超載來實現其他目的) – iammilind 2011-06-02 06:51:30