【发布时间】:2015-08-18 17:09:01
【问题描述】:
我正在做一个关于模板的练习,我现在正在处理专业化问题。我已经定义了一个函数T read_val(T& v),它接受来自cin 的输入并在我的template<typename T> struct S 中编译T val。我希望将此函数专门用于类型 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
头文件.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 <iostream>int main(){`Smy_S;``int val;``S.read_val(&val);``std::cout } 之类的,我没编译... -
好的,我已经全部移到头文件中了。我认为将文件一分为二更正确。这是我第一次处理模板。
-
这就是我向您推荐一个示例的原因。因为根据您的实现,我看到您错过了模板的重点。您只需定义一次(无需为 int、float 等每种类型手动重写,编译器会为您完成)。