将 C++ 类更改为模板

Posted

技术标签:

【中文标题】将 C++ 类更改为模板【英文标题】:Change c++ class to template 【发布时间】:2019-11-27 00:15:56 【问题描述】:

更新:感谢您的所有回复,我确实通知了我的教授,他解决了他的问题。再次感谢您的所有帮助!

我把我的类变成了一个模板,然后尝试运行下面的代码,结果却报了三个错误。

sorter.h

#pragma once

#ifndef SORT_THINGS
#define SORT_THINGS

#include <utility>
template <typename T>
class sorter 
    public:
        sorter(T a,T b,T c): _aa, _bb, _cc 
            using std::swap;

            if (_a > _b)  swap (_a, _b); 
            if (_b > _c)  swap (_b, _c); 
            if (_a > _b)  swap (_a, _b); 
        

        const T& a() const  return _a; 
        const T& b() const  return _b; 
        const T& c() const  return _c; 
    private:
        T _a, _b, _c;
;

#endif

tests.cpp(无法编辑tests.cpp文件,教授创建了这个文件并锁定了编辑)

#include <iostream>

#include "sorter.h"

template <typename T>
void test_sort(std::istream& in, std::ostream& out)

    T a, b, c;
    in >> a >> b >> c;
    sorter<T> s a, b, c;
    out << s.a() << ' ' << s.b() << ' ' << s.c();


int main(int, char* argv[])

    using namespace std;
    if (argv[2] == "int"s) 
        test_sort<int>(cin, cout);
     else if (argv[2] == "char"s) 
        test_sort<char>(cin, cout);
     else if (argv[2] == "string"s) 
        test_sort<std::string>(cin, cout);
     else 
        cerr << "ungecognized test type.\n";
        return 1;
    
    return 0;

错误:

./tests.cpp:17:20: error: unable to find string literal operator 'operator""s' with 'const char [4]', 'long unsigned int' arguments
     if (argv[2] == "int"s) 
./tests.cpp:19:27: error: unable to find string literal operator 'operator""s' with 'const char [5]', 'long unsigned int' arguments
      else if (argv[2] == "char"s) 
./tests.cpp:21:27: error: unable to find string literal operator 'operator""s' with 'const char [7]', 'long unsigned int' arguments
      else if (argv[2] == "string"s) 

问题:有什么我应该更改它 sorter.h 以允许代码工作,而不会再次发生错误? -对不起,因为没有真正解释我的问题是什么。

【问题讨论】:

"我需要模板化以下类" - 为什么?那会达到什么目的?你想用模板做什么?您认为它会解决什么问题?请将您的问题缩小到特定问题,并提供足够的详细信息来确定适当的答案。只需在 class 声明上方添加 template&lt;typename T&gt; 即可完成对类的模板化。它不会有用,但会以当前形式回答您的问题。 在一个非常基本的级别上坚持template&lt;typename T&gt; 在您的类声明上方,并将int 替换为T 当你已经有一个 header 保护时使用 #pragma once 是完全多余的。坚持其中任何一个。 (标题保护是可移植的,#pragma 是特定于编译器的。) 错误消息与模板没有任何关系。即使sorter 不是模板,它们也会在那里。你在main 中忘记了using namespace std::string_literals; 我已经更新了我的答案以包含一个仅修改sorter.h 的解决方案,但正如我已经说过的那样,这确实是你教授的错误。我会简单地请他们或导师/助理检查他们是否真的打算以这种方式完成作业。 【参考方案1】:

您打算在字符串文字之后与s 一起使用的字符串文字运算符,例如这里:

if (argv[2] == "int"s)

std::literals::string_literals 中定义。需要将其导入当前上下文,以便通过非限定名称查找找到它。

通常这是在使用运算符的适当范围内通过using namespace std::string_literals; 完成的。按照你代码中using namespace std;的例子,应该放在main

int main(int, char* argv[])

    using namespace std;
    using namespace std::string_literals;

...

您的问题表明您不应该更改main。在这种情况下,这显然是给你分配任务的人犯的一个错误。

如果你真的想在这个特定的实例中进行这项工作,只修改sorter.h,那么你也可以在#include &lt;utility&gt;之后添加using namespace std::string_literals;。然而,将using namespace 语句放在头文件中被认为是一种不好的风格,因为它以一种不受控制的方式将名称引入所有使用头文件的翻译单元的全局命名空间,并且不应该这样做。

这里的错误是你的教授犯了一个很容易为他们解决的简单错误。

【讨论】:

以上是关于将 C++ 类更改为模板的主要内容,如果未能解决你的问题,请参考以下文章

Xcode:将 UIButton 类更改为自定义类后,已发送事件消失

无法将 UIButton 的自定义类更改为 GIDSignInButton

当asp.net的更新面板触发时,css类更改为初始状态

对于 iOS,将 ViewController.xib 自定义类更改为另一个类是啥意思?

将资源文件夹目录从目标类更改为 Java 中的源

需要将socket.io类更改为单例