Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用注入的类名调用成员函数_C++ - Fatal编程技术网

C++ 使用注入的类名调用成员函数

C++ 使用注入的类名调用成员函数,c++,C++,在,我看到以下代码 struct foo { static foo& instance() { static foo f; return f; } }; 及 很好 但是,在上,我看到以下代码: namespace ASP { class ASp { public: ASp(); ASp(FILE* fp); }; } 但是 未能在g++4.8.2和Visual Stud

在,我看到以下代码

struct foo {
  static foo& instance() {
    static foo f;
    return f;
  }
};

很好

但是,在上,我看到以下代码:

namespace ASP
{
    class ASp
    {
        public:
            ASp();
            ASp(FILE* fp);  
    };
}
但是

未能在g++4.8.2和Visual Studio 2010中编译

g++报告:

错误:应为类型说明符
ASp*ASp=新的ASp::ASp();
Visual Studio报告:

错误C2061:语法错误:标识符“{ctor}”

为什么注入的类名适用于第一种情况而不适用于第二种情况?

我认为GCC提供了一个非常有用的提示:

error: expected type-specifier
new
运算符需要紧跟其后的类型名,而不是构造函数名

表达式
ASp::ASp
可以引用类型的构造函数或类型本身。但是,C++对如何解决这个模糊性有规则:在这种情况下,它默认为构造函数,而不是类型。为了强制将其解析为类型,必须在其前面加上
typename
(感谢ooga!)、
struct
、或
class
(或使用
访问其成员,如第一个示例所示):


您还可以使用
typename
。编译器不知道asp是表示名称空间还是表示类。请改用asp::asp。@user1535111,名称空间为
asp
,大写为
P
。类名是
ASp
,小写的
p
。我错了!但这两个示例都无法在vs2015预览下编译,并给出相同的错误!在第二个示例中添加typename后,在gcc下这两个都可以!
using namespace ASP;
ASp* asp = new ASp::ASp();
error: expected type-specifier
using namespace ASP;
ASp* asp = new class ASp::ASp();