2011-09-11 40 views
1

我的代碼是像下面,當我編譯它,我收到此錯誤:爲什麼我不能爲命名空間中的變量賦值?

two.cpp:5: error: expected constructor, destructor, or type conversion before '= ' token

#include <iostream> 
using namespace std; 
namespace a1{ 
    int a=3; 
    a=4; 
} 

int main(){ 
    cout << a1::a<<endl; 
} 

我遇到了這個問題,當我在兩個文件中定義的命名空間,在第二個文件,我不能爲第一個文件中定義的變量賦值。

我在學習Beginning ANSI C++,並且在本書中找不到關於此的任何信息。

回答

4

命名空間的目的是爲了避免名稱衝突。所以用命名空間來包圍你的變量和類聲明。但名稱空間本身並不提供運行代碼的腳手架。你的a = 4是怎麼回事;聲明?應該在哪裏執行?你需要把它放在一個函數或方法中,而不是放在名字空間中。

+0

Re「應該在哪裏執行」,使它正確執行的地方很簡單,就像這樣:'bool const bah =(a = 4);'。由於這個構造執行得很好,所以「應該在哪裏執行」這個問題會增加一些重量。你的想法是什麼? –

+0

@Alf我必須承認我不懂你的結構'const bah =(a = 4);'我會認爲無論是作業還是初始化(a = 4)都有int類型而不是bool。 –

0

你的第二個文件是否知道int a的定義; ?命名空間不像其他語言那樣神奇地工作,你仍然需要在其他文件中包含一個包含int a定義的頭文件,或者在列表中將它定義爲外部文件。

+0

是的,第二個文件包含第一個文件。 – zhangcheng

5

您可以在命名空間範圍(例如,您可以擁有定義)進行聲明。

int a = 3; 

但你不能在命名空間內非聲明語句。

例如,分配如

a = 4; 

不是聲明:它純粹詢問的效果。

但是,您可以將它放在函數的主體中,例如在main

乾杯&心連心,

相關問題