首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在一个单独的(.cpp)文件中定义属于一个可变的试探类的成员函数?

有没有办法在一个单独的(.cpp)文件中定义属于一个可变的试探类的成员函数?
EN

Stack Overflow用户
提问于 2021-07-16 20:11:50
回答 1查看 44关注 0票数 0

我知道把你所有的模板代码放在头文件中的传统智慧,“它就是工作”。

然而,我是一个非常喜欢干净漂亮的头文件的粉丝。我想知道是否有一种方法可以在任意模板的头文件中有声明,在cpp文件中有定义。

我特别不能让它在拥有可变模板和非模板化静态成员函数的类的情况下工作。

从我能用“普通”模板化类得出的结论是:

代码语言:javascript
复制
//in header
template<int bar>
class foo
{
    void member_method();
};

//in cpp
template<int bar>
void foo<bar>::member_method()
{
    ...
}

工作得很好,但是我想不出一种方法来完成以下工作:

代码语言:javascript
复制
//in header
template<int bar, int... args>
class foo
{
    void member_method();
};

//in cpp
template<int bar, int args>
void foo<bar, args...>::member_method()
{
    ...
}

这是我的具体案例:

代码语言:javascript
复制
//in header
namespace awmms
{
    template<typename T, size_t num_segments, size_t, int chunking_stratagy, int... chunk_storage_sizes>
    class chunk_allocator
    {
        public:
         ...
        private:
            static void chunk(const int& segment);
            ...
    };
}
//in cpp
namespace awmms
{
    template<typename T, size_t num_segments, size_t, int chunking_stratagy, int... chunk_storage_sizes>
    void chunk_allocator<T, num_segments, chunking_stratagy, chunk_storage_sizes...>::chunk(const int& segment)
    {
        ...
    }
}

这将生成以下编译器错误:

代码语言:javascript
复制
/home/ebony/git/Ebony-Ayers/awmms/src/awmms.cpp:34:115: error: invalid use of incomplete type ‘class awmms::chunk_allocator<T, num_segments, chunking_stratagy, chunk_storage_sizes ...>’
   34 |         void chunk_allocator<T, num_segments, chunking_stratagy, chunk_storage_sizes...>::chunk(const int& segment)
      |                                                                                                                   ^

对这个例子的任何帮助,或者对模板的异想天开的世界的洞察,我们都会非常感激。

EN

回答 1

Stack Overflow用户

发布于 2021-07-16 22:07:21

您必须考虑编译器必须做些什么。编译器必须生成代码,它将在您使用模板时生成代码,而不是在您声明模板时生成代码。如果您将实现隐藏在一个.cpp文件中,那么就没有办法为特定用途生成该代码。

如果您的模板化类继承自未模板化的基类,那么您至少可以在基类中完成模板类的部分工作。这种方法只能让你走到这一步,而且可能远远达不到你想要的程度。

换句话说,您可以创建第二个include文件并将其命名为您想要的任何名称,但它必须以某种方式包含在您实际使用模板化类的任何位置。所以即使它不是一个.h文件,它仍然是一个包含文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68408831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档