类定义之外的静态类函数的定义

时间:2012-02-28 01:07:38

标签: c++

考虑以下简单的类定义 -

    // file A.h
#include <iostream>
class A {
public:
  static int f();
  static const int aa;
};


    // file A.cpp
#include "a.h"
using namespace std;
const   int A::aa = 10;
int A::f() {
    return A::aa;
}

这是我的主要文件 -

    // main.cpp file
#include "a.h"
#include "b.h"
using namespace std;
const int A::aa = 100;
int A::f();
int main() {
    cout << A::aa << "\n";
    cout << A::f() << "\n";
}

当我尝试编译main.cpp时,编译器抱怨类外的main.cpp中的A :: f()声明是声明,而不是定义。为什么是这样?我不打算在main.cpp中定义A :: f()。它在A.cpp中定义,链接器应将main.cpp中A :: f()的声明与其在A.cpp中的定义链接起来。所以我不明白为什么我会收到这个错误。请注意,这是编译错误。

3 个答案:

答案 0 :(得分:3)

C ++ 11标准§9.3 [class.mftc] p3

  

[...] 除了出现在类定义之外的成员函数定义,并且类模板和成员函数模板(14.7)的成员函数的显式特化除外类定义,成员函数不得重新声明

除此之外,由于A::aa的多个定义,您将收到链接器错误,但从您的上一句判断,您似乎期望这样做。

答案 1 :(得分:1)

该类及其成员已经定义,您只需将该文件包含在您的主文件中(您已完成)。您无需声明或重新定义它。

答案 2 :(得分:0)

在第二个剪辑中,你不应该声明A的方法。