【问题标题】:Template Function Specialization模板功能特化
【发布时间】:2015-08-18 17:09:01
【问题描述】:

我正在做一个关于模板的练习,我现在正在处理专业化问题。我已经定义了一个函数T read_val(T& v),它接受来自cin 的输入并在我的template<typename T> struct S 中编译T val。我希望将此函数专门用于类型 intdoublecharstring 但是,当我尝试这样做时,我不断收到错误消息。这是我写的:

Header.h:

#ifndef Templates_Header_h
#define Templates_Header_h
#include <iostream>

using namespace std;

template<typename T>
struct S
{
private:
    T val;
public:
    S() : val{} {};
    T* get();
    T* get() const;
    T set();
    T operator=(const T&);
    T read_val(T& v);
    void print_val() const;
};

template<typename T>
void S<T>::print_val() const
{
    cout << "Value is: " << val << endl;
}

template<typename T>
T* S<T>::get()
{
    T* p = &val;
    return p;
}

template<typename T>
T S<T>::set()
{
    T newvalue;
    cout << "Type new value: ";
    cin >> newvalue;
    S<T>::val = newvalue;
    return S<T>::val;
}

template<typename T>
T S<T>::operator=(const T&)
{
    T val1;
    val1 = val;
    return *this;
}

template<typename T>
T* S<T>::get() const
{
    T* p = &val;
    return p;
}

template<typename T>
T S<T>::read_val(T &v)
{
    cout << "Type Value: ";
    cin >> v;
    return S<T>::val = v;
}

#endif

头文件.cpp

#include <stdio.h>
#include "Header.h"
#include "std_lib_facilities.h"

template <>
struct S <int>  // Specialization
{
private:
    int val;
public:
    S() : val{0} {};
};

template<>
struct S<char>  // Specialization
{
private:
    char val;
public:
    S() : val{'0'} {};
};

template <>
struct S<double>  // Specialization
{
private:
    double val;
public:
    S() : val{0.0} {};
};

template <>
struct S<string>  // Specialization
{
private:
    string val;
public:
    S() : val{""} {};
};

template<>
struct S<vector<int>>  // Specialization
{
private:
    vector<int> val;
public:
    S() : val{0} {};
};

template<> // !! ERROR !!
int read_val(int& v)
{
    cout << "Type a value: ";
    cin >> v;
    return v;
}

Xcode 报告“没有函数模板与函数模板特化 'read_val' 匹配”。我正在网上冲浪阅读示例和参考资料,但我无法解决它。你能帮助我吗?我需要一个例子来解决它。 谢谢!

【问题讨论】:

  • cplusplus.com/doc/tutorial/templates 在那里查找“类模板”并查看如何使用它的示例。看来您不了解模板的意义及其用法。
  • @AlexLop。我看了看,但我不明白你的意思。
  • 模板标题不应该有 CPP 文件。您的实现已经在头文件中!创建 main.cpp:#include "Header.h"#include &lt;iostream&gt;int main(){`S my_S;``int val;``S.read_val(&val);``std::cout } 之类的,我没编译...
  • 好的,我已经全部移到头文件中了。我认为将文件一分为二更正确。这是我第一次处理模板。
  • 这就是我向您推荐一个示例的原因。因为根据您的实现,我看到您错过了模板的重点。您只需定义一次(无需为 int、float 等每种类型手动重写,编译器会为您完成)。

标签: c++ templates


【解决方案1】:

模板标题不应有 CPP 文件。您的实现已经在头文件中! 使用以下命令创建 main.cpp:

#include "Header.h" 
#include <iostream> 
int main() 
{ 
    S<int> my_S;
    int val;

    my_S.read_val(val/*by ref*/);
    std::cout << "The read value is " << val << std::endl;
    return 0;
} 

或者类似的东西,我没有编译它...... 根据您的实现,我发现您错过了模板的重点。您只需定义一次(无需为 int、float 等每种类型手动重写,编译器会为您完成)。

【讨论】:

  • 我明确定义了它们,因为它是我家庭作业的一部分!我知道这样做是没用的,而且很冗长……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2020-06-26
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多