【发布时间】:2017-08-07 05:59:41
【问题描述】:
我打算拥有一个具有内部类和名称相似的方法的类。 example1.cpp 的代码编译没有问题,即使我有一个内部类和一个同名的方法B。如果我用小写字母将Position 重命名为position,example2.cpp 将不起作用。在这种情况下,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;
}
【问题讨论】:
-
请注意,对于 c++,位置和位置只是 2 个不同的标识符,例如狗和猫。避免使用仅用于大写的标识符。编译器不会混淆,但程序员(包括你)可能会
-
@GianPaolo,我打算创建一个自动代码生成器。而且由于缺乏术语,我什至更喜欢有一个函数和一个类名相似的。但是,我是干净代码的粉丝。
-
您(或其他人)将不得不使用自动生成的代码;标识符大小写的差异不会轻易被发现。考虑在前面加上下划线 _ 或其他东西
-
@GianPaolo,问题是当用户同时使用
position和_position。
标签: c++ c++11 compiler-errors