必须在类成员函数返回类型中提供更具体的类型,但不是参数类型?

问题描述:

可能重复:
Where and why do I have to put the “template” and “typename” keywords?必须在类成员函数返回类型中提供更具体的类型,但不是参数类型?

最近的一段代码让我感到困惑:

class A { 
public: 
    typedef int SomeType; 

    void func(SomeType i); 
    SomeType func2(); 
}; 

void A::func(SomeType i) { 
    cout << "in A, value: " << i << endl; 
} 
SomeType A::func2() { 
    return 123; 
} 

int main() { 
    A a; 
} 

G ++ 4.4提供了一个编译错误,它并不知道SOMETYPE在编译A :: func2:

error: 'SomeType' does not name a type 

但同样SOMETYPE在A :: FUNC编译好(SOMETYPE我)

class A { 
public: 
    typedef int SomeType; 

    void func(SomeType i); 
}; 

void A::func(SomeType i) { 
    cout << "in A, value: " << i << endl; 
} 

任何人都可以帮助我理解?看来C++对待参数类型和返回类型是不公平的?

+2

@Xeo:只有依赖模板参数的名称才需要'typename' /'template'关键字。这里没有模板。 – interjay 2012-07-25 19:04:05

+0

在类声明之外使用'A :: SomeType'而不是'SomeType'修复了它。 HTTP:// ideone。com/1VZdy – Wug 2012-07-25 19:08:15

+0

@interjay:对,nvm。最近用模板处理很多事情,只是没有发生,这不是*一个。 :s – Xeo 2012-07-25 19:08:26

GCC是正确的 -

/* can't use unqualified name */ A:: /* can use unqualified name */ () { 
} 

A::之前,您需要使用A::来限定嵌套类型。因此,你需要:

A::SomeType A::func2() { 
    //whatever 
} 
+0

是的,我可以理解这可能是必要的,但是让我困惑的是为什么参数类型不需要A :: – Kai 2012-07-25 22:40:57

+0

@凯这就是语言的工作原理。在使用'A :: func2'限定定义之后,您已经在该类的名称范围内。没有那么多。你不应该在这上面浪费太多时间。这就是语言的设计,纯粹和简单。 – 2012-07-25 22:47:19

您需要更改

SomeType A::func2() { 

A::SomeType A::func2() { 

,这不同于FUNC1(原因)是SomeType在参数表中使用有这样编译器知道它可以请在class A中查看该类型。但是,func2(),SomeType是返回类型,编译器不知道在class A中查找。

简单地改变FUNC2来定义:

A::SomeType A::func2() { 
    return 123; 
} 

你需要告诉编译器要使用A类中定义的类型名SOMETYPE

相反,使用这个资格与类名SOMETYPE在

A::SomeType A::func2() { 
     (...) 
    } 

SOMETYPE不能外A类和FUNC2是A类 此URL外部可见的使用 - 指出在C++规范

http://balbir.blogspot.com/2005/06/scope-of-typedefs-in-class-in-c.html

在特别是下列,类型名称类defini内限定如果没有资格,他们不能在课外使用 。