2010-03-03 344 views
3

BOOST_CHECK_THROW以下不會編譯:編譯器會抱怨構造

class Foo { 
public: 
    Foo(boost::shared_ptr<Bar> arg); 
}; 

// in test-case 

boost::shared_ptr<Bar> bar; 

BOOST_CHECK_THROW(Foo(bar), std::logic_error); // compiler error here 

酒吧的實現並不重要。編譯器抱怨,Foo沒有合適的默認構造函數(VC++ 2005)。如果我添加一個默認的構造函數,它會起作用,並且它實際上被調用。爲什麼這個語句需要一個默認的構造函數?

回答

9

發生這種情況是因爲BOOST_CHECK_THROW是一個宏,並且Foo(bar)正在擴展爲語句。編譯器會看到這個語句並將其解釋爲需要默認構造函數的變量聲明Foo bar;

的解決方案是給變量名:

BOOST_CHECK_THROW(Foo temp(bar), std::logic_error); 

換句話說BOOST_CHECK_THROW將擴大到像

try 
{ 
    Foo(bar); 
    // ... fail test ... 
} 
catch(std::logic_error) 
{ 
    // ... pass test ... 
} 

和編譯器解釋Foo(bar);作爲變量稱爲聲明酒吧。我們可以用一個簡單的程序檢查:

struct Test 
{ 
    Test(int *x) {} 
}; 

int main() 
{ 
    int *x=0; 
    Test(x); 
    return 0; 
} 

這給下面的錯誤使用g ++

test.cpp: In function ‘int main()’: 
test.cpp:10: error: conflicting declaration ‘Test x’ 
test.cpp:9: error: ‘x’ has a previous declaration as ‘int* x’ 
+0

的確。謝謝。 – 2010-03-03 14:38:44

相關問題