gpt4 book ai didi

C++ : Any possibility to declare a struct in main. cpp 但在 header 中有一个带有类的模板

转载 作者:行者123 更新时间:2023-11-28 02:29:51 24 4
gpt4 key购买 nike

作为使用模板的 C++ 初学者,我有一个问题,如果它很荒谬,请原谅。

在像这样的头文件中有一个模板:

template <class T> class MyClass

是否可以像这样在 main.cpp 中定义一个结构:

struct CC;

struct CC
{

MyClass (CC) p;
CC() : p(0){}
};

或者:

struct Foo {

MyClass<struct Foo> bar;
MyClass<std::string> text;
};

我对此很迷茫。对不起。

最佳答案

首先,模板是否在头文件中并不重要。编译器只看到预处理后的代码,此时没有文件。只是文本。

让我们考虑第一个示例的变体:

template< class T >
class MyClass
{
int x;
};

struct CC
{

MyClass<CC> m;
CC() {}
};

auto main() -> int {}

这编译得很好,因为 MyClass模板实际上并不使用 CC对于任何东西,除了知道它是一种类型之外,不需要任何其他知识。

但是假设使用了它的大小。这需要一个完整类型。或者换句话说,完整类型大小已知的类型。

template< class T >
class MyClass
{
char x[sizeof( T )];
};

struct CC
{

MyClass<CC> m;
CC() {}
};

auto main() -> int {}

这不能编译,因为在 MyClass<CC> 的位置被使用,大小为CC目前还不知道。额外的数据成员,或者例如一个虚函数,可以稍后在类定义中定义。这会增加尺寸。


作为一个近似的反例,考虑第三个变体:

template< class T >
class MyClass
{
public:
void foo()
{
char x[sizeof( T )];
}
};

struct CC
{

MyClass<CC> m;
void use_foo() { m.foo(); }
CC() {}
};

auto main() -> int {}

这编译得很好,但为什么呢?显然这里的模板也需要完整的 CC类型?

但不,编译器将类中的成员函数定义视为已声明 inline并在类之外定义,如下所示:

template< class T >
class MyClass
{
public:
inline void foo();
};

template< class T >
void MyClass<T>::foo()
{
char x[sizeof( T )];
}

struct CC
{

MyClass<CC> m;
inline void use_foo();
CC() {}
};

void CC::use_foo() { m.foo(); }

auto main() -> int {}

从这里你可以看出 MyClass模板本身不依赖于 CC 大小的知识.

关于C++ : Any possibility to declare a struct in main. cpp 但在 header 中有一个带有类的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29328412/

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