C++:在 class body 外部定义但包含在 header 守卫内的成员函数的 ODR 违规(如 YouCompleteMe 插件所示)
C++: ODR violation for member functions defined outside of class body but enclosed within header guard (as shown in YouCompleteMe plugin)
我有一个简单的 header 文件,如下所示。
#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
string address;
auto get_name() const -> string;
};
string Person::get_name() const { // Function 'get_name' defined in a header file; function definitions in header files can lead to ODR violations
return this -> name;
}
#endif
问题:
尽管 Person::get_name() 函数是在 Person 结构之外定义的,但该函数是在 header 守卫 PERSON_H 内部定义的。 YouCompleteMe 工具(假定使用 g++),它声明它违反了 ODR。为什么会违反 ODR?这个函数永远不会被定义超过一次,因为它由 header 守卫 PERSON_H 控制。我不确定 YouCompleteMe 工具中是否存在错误,因为我注意到我没有使用 visual studio.
收到相同的警告消息
任何帮助都会很棒。
谢谢
它可以包含在多个编译单元中。如果标记定义inline
应该会很高兴。
我有一个简单的 header 文件,如下所示。
#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
string address;
auto get_name() const -> string;
};
string Person::get_name() const { // Function 'get_name' defined in a header file; function definitions in header files can lead to ODR violations
return this -> name;
}
#endif
问题:
尽管 Person::get_name() 函数是在 Person 结构之外定义的,但该函数是在 header 守卫 PERSON_H 内部定义的。 YouCompleteMe 工具(假定使用 g++),它声明它违反了 ODR。为什么会违反 ODR?这个函数永远不会被定义超过一次,因为它由 header 守卫 PERSON_H 控制。我不确定 YouCompleteMe 工具中是否存在错误,因为我注意到我没有使用 visual studio.
任何帮助都会很棒。
谢谢
它可以包含在多个编译单元中。如果标记定义inline
应该会很高兴。