2014-01-13 150 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