无法使用花括号初始化调用基类构造函数 intellisense 错误

4
我刚遇到了以下问题:
#include "stdafx.h"
#include <string>
#include <iostream>

class transaction{
protected:
    transaction(const std::string& log) { printLog(log); }
private:
    void printLog(const std::string& log) const { std::cout << log << "\n"; }
};

class inTrans : public transaction {
public:
    inTrans() : transaction( std::string("input") ) { }
};

class outTrans : public transaction {
public:
    outTrans() : transaction{ std::string("output") } { } //This doesn't work
};

Visual Studio 2013标记了第一个"{"为红色,并显示以下错误:

"错误:通过“transaction”指针或对象无法访问声明于第7行的受保护函数“transaction::transaction(const std::string &log)”."

问题在于,我仍然能够编译文件,一切似乎都运行得很好。 那么为什么会出现这个奇怪的错误?


你是否有意使用()为inTrans和{}为outTrans初始化列表?也许C++11支持一些{}的花哨初始化列表,我不知道。 - Neil Kirk
1
你的代码在GCC下编译正常。可能是Visual Studio中存在一个错误/缺失的功能? - 5gon12eder
使用gcc和clang都可以正常工作。听起来像是一个bug。 - T.C.
2
尽管问题似乎不大,但您应该提交一个错误报告,因为它导致您提出了一个SO问题,因为您认为自己有问题,显然会造成困惑。如果您能在问题中更新一个指向错误报告的链接,那就太好了,这样如果其他用户遇到相同的问题,他们就可以看到状态。 - Shafik Yaghmour
@Maximal:基本上你的问题是关于 IntelliSense 警告,因为编译器本身对代码没有问题。 IntelliSense 是 IntelliSense。它不打算成为一个完整的编译器。它说的每一句话都是建议性的。有时候它会感到困惑。问为什么 IntelliSense 做某些事情或者不做某些事情没有太大意义。也许他们会在下一个版本中更新它。 - AnT stands with Russia
显示剩余2条评论
1个回答

4

如果我们查看C++标准草案,第12.6.2Initializing bases and members中的语法表明你所拥有的是有效的语法,因此错误是一个bug:

ctor-initializer:
    : mem-initializer-list
mem-initializer-list:
    mem-initializer ...opt
    mem-initializer , mem-initializer-list ...opt
mem-initializer:
    mem-initializer-id ( expression-listopt)
    mem-initializer-id braced-init-list  <-- this applies to this case

这段代码在使用 gccclang 编译时都可以顺利通过。


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