我打算有一个类,它有一个内部类和一个名称相似的方法。的代码为example1.cpp
即使我有一个内部类和一个同名的方法,编译也没有问题B
. While example2.cpp
如果我重命名将不起作用Position
to position
用小写字母。在这种情况下,position()
方法和position
阶级之间存在冲突,我收到:
error: ‘ObjType::position<false> ObjType::position() const’ conflicts with a previous declaration
inline auto position() const->class position<false>{return {*this};}
^
compilation terminated due to -Wfatal-errors.
这两个类有什么区别?为什么后一个出错而前一个不出错?
g++ -std=c++11 exampleX.cpp -Wall -Wextra -Wfatal-errors && ./a.out
.
// example1.cpp
#include <iostream>
class A
{
public:
friend class B;
class B
{
public:
int x;
void show() {std::cout<<"x: "<<x<<std::endl;}
B(): x(6) {}
};
B B()
{
class B b;
return b;
}
};
int main()
{
A a;
a.B().show();
return 0;
}
.
// example2.cpp
#include <iostream>
#include <type_traits>
class Point
{
public:
double x,y,z;
void print() const
{
std::cout<<"x:"<<x<<", y:"<<y<<", z:"<<z<<std::endl;
}
};
class ObjType
{
template<bool> friend class Position;
Point data;
public:
template<bool ByRef>
class Position
{
typename std::conditional<ByRef,ObjType&,ObjType const&>::type ref;
public:
inline Position(typename std::conditional<ByRef, ObjType&, ObjType const&>::type ref) : ref(ref) {}
inline Position(const Point &ref): ref(ref){}
inline auto operator =(Point const& a)->Position&{ref.data.subvec(0,2)=a; return *this;}
inline auto operator =(Point&& a)->Position&{data=a; return *this;}
inline void print() const{ref.data.print();}
};
inline ObjType(const Point &data): data(data){}
inline void print() const{data.print();}
/*error > */ inline auto position() const->class Position<false>{return {*this};}
inline auto position()->class Position<true>{return {*this};}
};
int main()
{
ObjType obj({1.1,1.2,1.3});
std::cout<<"****************"<<std::endl;
std::cout<<"obj.print() :"<<std::endl;
obj.print();
std::cout<<"obj.position.print() :"<<std::endl;
obj.position().print();
std::cout<<"****************"<<std::endl;
return 0;
}