【问题标题】:C++ : Any possibility to declare a struct in main.cpp but having a template with class in headerC++:任何可能在 main.cpp 中声明一个结构,但在标头中有一个带有类的模板
【发布时间】:2015-03-29 11:15:38
【问题描述】:

作为一个使用模板的 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;
};

我对此非常迷茫。对不起。

【问题讨论】:

  • 你试过了吗?顺便说一句,c ++不需要使用struct Foo,但可以在你的MyClass&lt;&gt;中使用Foo
  • 这取决于MyClass。如果它在任何地方都需要模板参数是一个完整的类(即可以应用sizeof),那么不需要。因为CCFoo 类在用作模板参数时并不完整。
  • @Cheersandhth.-Alf 我不明白...

标签: c++ class templates struct


【解决方案1】:

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

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

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&lt;CC&gt; 的地方,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大小的知识。

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多