C++错误:预期类型说明符。

13

当我尝试像这样使用LoggerStream时,会出现“expected a type specifier”的错误:

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() {

    }
}

展示产生错误的代码将会很有帮助。例如,您是否忘记了 #include "Logger.h"。而且我看不出 Logger_WIN 有什么关联:您在编译时并没有遇到任何错误,对吧? - Roddy
@Roddy,我已经添加了代码。其他地方没有错误。 - Xenoprimate
现在我们有所进展了;-)请检查我的答案。 - Roddy
4个回答

20

你不能这样构造类成员:

  struct TestComponent::TestComponentImpl 
  {

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

相反,使用构造函数中的初始化列表,像这样:

struct TestComponent::TestComponentImpl 
{
   LoggerStream logger;

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

    ...    
}

而且我认为你已经陷入了“最令人烦恼的解析”中,因为编译器认为 logger 必须是一个函数,并且它抱怨 L"Test Component" 不是参数的类型说明符。请注意保留“Most Vexing Parse”链接。

啊该死——我曾经特意学习过它(最棘手的解析),所以不会陷入困境......哈哈,计划永远赶不上变化。谢谢你的坚持 :) - Xenoprimate
3
顺便说一下,我正在使用C++ 11,因此类初始化是可能的(https://dev59.com/ZWw15IYBdhLWcg3wo9Vx)。我只是用{}替换了(),一切都很好。 - Xenoprimate

3

你是否在任何地方提到了命名空间?你需要编写以下其中一个:

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");

记录器的声明已经在ophRuntime命名空间中了。尽管我尝试添加了一个明确的规范,但没有用。 - Xenoprimate

0

LoggerStream位于命名空间ophRuntime中,因此您的定义必须为:

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

0

在使用类LoggerStream时,您需要使用命名空间名称ophRuntime

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接