Pairwise类代表具有key:value的一对。我制作了一对模板,尝试在类中输入键和值并打印出来时遇到错误。
给出我的主意:
#include "file_name.h"
int main (){
Pairwise<string, string> example = {{"key", "value"}};
cout << example << endl;
}
还有我的头文件:
#pragma once
#include<iostream>
using std::ostream; using std::cout; using std::endl;
#include<string>
using std::string;
#include<utility>
using std::pair;
#include<sstream>
using std::ostringstream;
template<typename K, typename V>
struct Pairwise{
K first;
V second;
Pairwise() = default;
Pairwise(K, V);
//print out as a string in main
friend ostream& operator<<(ostream &out, const Pairwise &n) {
ostream oss;
string s;
oss << n.first + ":" + n.second; //possible error?
s = oss.str();
out << s;
return out;
}
};
运行main后,我的预期输出为:
key:value
但是,我遇到了错误:
h:28:11: error: 'std::basic_ostream<_CharT, _Traits> is protected within..."
答案 0 :(得分:1)
在编写时,您将运算符定义为成员函数,这很可能不是故意的。像...一样分割
template<typename K, typename V>
struct Pairwise{
K first;
V second;
Pairwise() = default;
Pairwise(K, V);
//print out as a string in main
friend ostream& operator<<(ostream &out, const Pairwise &n);
};
template<typename K, typename V>
ostream& operator<<(ostream &out, const Pairwise<K,V> &n) {
...
return out;
}
它应该可以工作。
BTW:请注意,在struct
中,默认情况下,所有成员都是公开的;因此即使没有friend
声明,您也可以访问它们。
答案 1 :(得分:1)
h:25:59:朋友声明删除了非模板函数。
您缺少将函数声明为采用Pairwise<K, V>
的模板:
header.h:
#ifndef HEADER_H_INCLUDED /* or pragma once */
#define HEADER_H_INCLUDED /* if you like it */
#include <iostream> // or <ostream>
template<typename K, typename V>
class Pairwise { // made it a class so that the
K first; // friend actually makes sense.
V second;
public:
Pairwise() = default;
Pairwise(K first, V second)
: first{ first }, second{ second }
{}
template<typename K, typename V>
friend std::ostream& operator<<(std::ostream &out, Pairwise<K, V> const &p)
{
return out << p.first << ": " << p.second;
}
};
#endif /* HEADER_H_INCLUDED */
源文件:
#include <iostream> // the user can't know a random header includes it
#include <string>
#include "header.h"
int main()
{
Pairwise<std::string, std::string> p{ "foo", "bar" };
std::cout << p << '\n';
}
旁注:您也可以使用
{
using Stringpair = Pairwise<std::string, std::string>;
// ...
Stringpair sp{ "foo", "bar" };
}
如果您需要更多的时间。
您将其他错误归因于将std::ostringstream
中的std::ostream
与operator<<()
混淆。
答案 2 :(得分:0)
在c ++中,更少通常更多...
with open("lower.lst", "r") as f:
o = [word for word in f if (len(word) >= 4 and len(word) <= 8)]
with open("outfile.lst", "w") as f:
f.write(o)