考虑以下简单的类定义 -
// 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中的定义链接起来。所以我不明白为什么我会收到这个错误。请注意,这是编译错误。
答案 0 :(得分:3)
C ++ 11标准§9.3 [class.mftc] p3
:
[...] 除了出现在类定义之外的成员函数定义,并且类模板和成员函数模板(14.7)的成员函数的显式特化除外类定义,成员函数不得重新声明。
除此之外,由于A::aa
的多个定义,您将收到链接器错误,但从您的上一句判断,您似乎期望这样做。
答案 1 :(得分:1)
该类及其成员已经定义,您只需将该文件包含在您的主文件中(您已完成)。您无需声明或重新定义它。
答案 2 :(得分:0)
在第二个剪辑中,你不应该声明A的方法。