我正在对模板进行练习,现在我正在处理专业化。我定义了一个函数T read_val(T& v)
,它从cin
获取输入并编译T val
内的template<typename T> struct S
。我希望将此功能专门用于int
,double
,char
,string
类型,但是,当我尝试这样做时,我会不断收到错误。这是我写的:
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
Header.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'”。我正在浏览网上阅读示例和参考资料,但我无法解决它。你能帮助我吗?我需要一个例子来记住它。 谢谢!
答案 0 :(得分:0)
模板标题不应有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等,编译器会为你做这个。)