2014-01-13 148 views
3

當我嘗試使用LoggerStream這樣,我得到「預期類型說明符」:C++錯誤:預期類型說明符

const LoggerStream logger(L"Test Component");

這裏就是我試圖使用LoggerStream

#include "Logger.h" 
#include "TestComponent.h" 

namespace ophRuntime { 
    struct TestComponent::TestComponentImpl { 


     private: 
     LoggerStream logger(L"Test Component"); 

     NO_COPY_OR_ASSIGN(TestComponentImpl); 
    }; 

    TestComponent::TestComponent() : impl(new TestComponentImpl()) { 

    } 

    bool TestComponent::Init() { 

    } 
} 
+0

顯示生成錯誤的代碼會很有幫助。例如,您是否忘記了'#include「Logger.h」'...並且我看不到Logger_WIN如何相關:您沒有編譯錯誤 - 是嗎? – Roddy

+0

@Roddy我添加了代碼。別處沒有錯誤。 – Xenoprimate

+0

現在我們正在某處;-)檢查我的答案。 – Roddy

回答

7

你不能建造這樣的類成員: -

struct TestComponent::TestComponentImpl 
    { 

    private: 
     LoggerStream logger(L"Test Component"); 

相反,使用在構造器中的初始化列表,如下所示:

struct TestComponent::TestComponentImpl 
{ 
    LoggerStream logger; 

    TestComponent::TestComponent() : impl(new TestComponentImpl()), 
            logger("L"Test Component") 
    { 
    } 

    ...  
} 

我想你已經愛上因爲編譯器認爲logger必須是一個函數的"Most Vexing Parse"的犯規,而它的抱怨L"Test Component"不是參數的類型說明符。

+0

Ah damnit - 我在這方面做了一點教育(最令人頭痛的解析),所以我沒有被它困住...哈哈,最好的計劃和所有這一切。感謝你的毅力:) – Xenoprimate

+0

FWIW我在C++ 11上,所以類初始化是可能的(http://stackoverflow.com/questions/6482566/has-in-class-member-initialization-feature-made-into -c11)。我簡單地用{}替換了(),一切都很好。 – Xenoprimate

0

LoggerStream在命名空間ophRuntime這樣你的定義必須是

const ophRuntime::LoggerStream logger(L"Test Component"); 
0

您需要使用類LoggerStream時使用的命名空間名稱ophRuntime

const ophRuntime::LoggerStream logger(L"Test Component"); 
2

你在任何地方提到的命名空間?你需要寫兩種:

using ophRuntime::LoggerStream; 
const LoggerStream logger(L"Test Component"); 

using namespace ophRuntime; 
const LoggerStream logger(L"Test Component"); 

const ophRuntime::LoggerStream logger(L"Test Component"); 
+0

記錄器的聲明已經在ophRuntime命名空間中。儘管如此,我試圖添加一個像這樣的明確的規範,但沒有用。 – Xenoprimate