gpt4 book ai didi

c++ - 同名的方法和内部类(错误 : . .. 与之前的声明冲突)

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:17 26 4
gpt4 key购买 nike

我打算有一个类,它有一个内部类和一个具有相似名称的方法。 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;
}

最佳答案

What is the difference between these two classes? Why the latter one is giving error but not the former one?

我们可以进一步将您的示例简化为以下类:

struct S {
struct C {};
void C() {}
};

在这种情况下,标准 doesn't forbid引入一个名称已被使用的类。它确实对这种情况开放:

If a class name is declared in a scope where a variable, function, or enumerator of the same name is also declared, then [...]

它只是规定如何引用它以及隐藏什么内容。
另一方面,考虑以下类:

struct S {
template<typename> struct C {};
void C() {}
};

在这种情况下,标准 strictly forbids it (除了少数异常(exception),均不适用于此处):

A class template shall not have the same name as any other template, class, function, variable, enumeration, enumerator, namespace, or type in the same scope

因此,您不可能使用相同的标识符命名您的类模板和周围的其他函数。
您仍然可以将所有类型打包在一个封闭范围内,在该范围内您无论如何都不会定义具有相同名称的函数。例如:

struct S {
struct T {
template<typename>
struct C {};
};

void C() {}
};

然后访问它们:

S::T::C<void> c;

关于c++ - 同名的方法和内部类(错误 : . .. 与之前的声明冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45540260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com