RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 937440
Accepted
Kaznachei
Kaznachei
Asked:2020-01-28 03:07:54 +0000 UTC2020-01-28 03:07:54 +0000 UTC 2020-01-28 03:07:54 +0000 UTC

头文件中类模板的声明与单独实现文件中的方法定义不起作用

  • 772

例如,我有Test.h一个类模板,其中定义了类模板,并且以隐式Test方式Test.cpp定义了类的方法和构造函数,但在main.cpp我初始化的某个地方Test<int> testValue。由于编译器不知道如何Type在Test.cpp. 一个人如何“作弊”(不使用额外的第三类文件.inl或其他任何东西)

测试.h

#ifndef Test
#define Test

template <class Type>
class Test
{
private:
    Type value;
public:
    Test(Type valueOfUser);
    Type getValue();
};

#endif // Test

测试.cpp

#include "Test.h"

template <typename Type> Test<Type>::Test(Type valueOfUser): value(valueOfUser) {}
template <typename Type> Type Test<Type>::getValue () { return value; }

主文件

#include "Test.h"

intt main()
{
  Test<int> test;
  test.getValue();
  return 0;
}
c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Harry
    2020-01-28T03:10:59Z2020-01-28T03:10:59Z

    他们告诉世界多少次......(c)

    不要将模板函数/类定义放在单独的 .cpp 文件中。仅将所有内容放在头文件中 - 否则不会发生实例化,因此我们拥有我们所拥有的。

    来自 Stroustrup 的建议(A Tour of C++,adv. 7-6):

    没有单独的模板编译:您必须在使用它们的每个翻译单元中#include 模板定义。

    自己想想 - 在编译 Test.cpp 文件时,编译器如何知道(使用什么模板参数)将在另一个文件中实例化?

    在另一个文件(main.cpp)中——如果无法访问实现代码,你怎么知道如何实例化模板?

    解决方法是在模板实现文件中显式实例化所需的类型

    template class Test<конкретный_тип>;
    

    是可能的,但是很不方便——下次你main.cpp需要一个新类型的类,你需要立即将它添加到test.cpp. 更糟糕的是,如果某些类型变得不必要,但继续被实例化和链接。

    • 13
  2. Best Answer
    HolyBlackCat
    2020-01-28T03:23:57Z2020-01-28T03:23:57Z

    有一种方法,但不方便。

    Btest.cpp可以通过添加到文件末尾来显式实例化 class Test:Type = int

    template class Test<int>;
    

    不便之处在于,.cpp您必须在文件中列出您计划使用该类的所有模板参数集。

    这是最后的手段。更好地听@Harry 并将模板函数定义保留在头文件中。

    • 6
  3. AnT stands with Russia
    2020-01-28T03:41:30Z2020-01-28T03:41:30Z

    首先,您的方法的失败与“编译器不知道如何在 Test.cpp 中定义我的类型”无关。你不断地从一个问题到另一个问题重复这一点,但这与问题的本质无关。

    其次,您有机会强制某些东西在此版本中工作:通过在.cpp文件中显式实例化您的定义,以用于在程序中使用您的模板的那些类型。但这通常是对显式实例化能力的不当使用。

    模板的全部意义在于编译器本身应该自动确定程序中需要哪些版本的模板实体并自动生成它们。这要求所有模板定义在任何地方都是可见的,而不是隐藏在某个.cpp文件中。语言中存在显式实例化的可能性主要是为了优化这个过程,而不是用手动实例化代替自动实例化。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5