C++ 模板类,友元运算符<&书信电报;超载

C++ 模板类,友元运算符<&书信电报;超载,c++,class,templates,operator-overloading,C++,Class,Templates,Operator Overloading,我正在尝试重载“查看常见问题解答”项。您发布的错误代码表明是操作符>引发了未解决的外部错误,而不是操作符featurevector-impl.cpp不正确。显式模板实例化如下所示: template class FeatureVector<int>; 模板类特征向量; 由于运算符不是成员,因此还必须显式实例化它们: template istream & operator >> <>(istream &, FeatureVector<i

我正在尝试重载“查看常见问题解答”项。

您发布的错误代码表明是
操作符>
引发了未解决的外部错误,而不是
操作符featurevector-impl.cpp不正确。显式模板实例化如下所示:

template class FeatureVector<int>;
模板类特征向量;
由于运算符不是成员,因此还必须显式实例化它们:

template istream & operator >> <>(istream &, FeatureVector<int> &);
模板istream&operator>>(istream&,FeatureVector&);

不过,我不建议像这样拆分模板定义,除非您真正热衷于微观管理哪些特定类将与模板一起使用(这与使用模板的精神背道而驰)。

不要让它变得如此复杂:

template<class FEAT_TYPE>
struct FeatureVector {
  FeatureVector(int = 0);

  friend std::istream& operator>>(std::istream &s, FeatureVector &x) {
    for(int d = 0; d < x.getDim(); d++) {
      s >> x.m_pFeat[d];
    }
    return s;
  }

  friend std::ostream& operator<<(std::ostream &s, FeatureVector const &x) {
    // since you're terminating with " " rather than separating:
    copy(x.m_pFeat, x.m_pFeat + x.getDim(), ostream_iterator<FEAT_TYPE>(s, " "));
    s << endl;
    return s;
  }

  //...
模板
结构特征向量{
特征向量(int=0);
friend std::istream&operator>>(std::istream&s,FeatureVector&x){
对于(int d=0;d>x.m_pFeat[d];
}
返回s;
}
friend std::ostream&operator根据,必须在类定义中将函数称为模板

class.h

#include <iostream>
using std::ostream;

template <typename T>
class A {
  public:
    ...

    template <typename J> // <-- CAUTION!
    friend ostream &operator<<(ostream &output, const A<J> &a);
};
#包括
使用std::ostream;
模板
甲级{
公众:
...


template//friend ostream&operator是同一个代码造成的错误吗?这个错误在operator>>上不起作用:嗨,伙计们,我编辑了原始帖子并包含了实际的代码。从不从标题中包含.cpp文件。只需换个名字:blah_detail.hpp,_blah.inc等等。我认为这不是问题。Javier是
\include
-直接从H文件中删除HPP文件,产生与常见问题解答链接相同的结果。确切地说,我已经在引用的链接中考虑了这个建议。无论如何,谢谢。@John,@Jahvier:我看不到
操作符>
函数模板的定义在
main
中可用。我也看不到显式的实例化当然。如果是的话,很抱歉这么吵。但是我想如果是的话,这个问题就不会被提出了。干杯&嗯,我编辑了这个类,所以操作符>>的定义已经包含在内了。@Javier:好吧,告诉我们这是否解决了问题,如果不是的话,发布一些实际的代码如何?嗨,正如我提到的,我没有把全部都放进去类定义。我当然有一个默认构造函数。所以,您的建议是将所有内容放在同一个文件中?这就是问题所在?出于组织目的,我更喜欢将文件分开。@Javier:不,最终我遇到的问题是您发布的错误消息抱怨的是
运算符>
,而不是
运算符or@Javier:另外,如果您能发布一个简单完整的示例来复制您遇到的问题,这将非常有帮助。您发布的Psudocode很难使用。嗨,John,我已经更新了该类,因为我正在尝试重载“>>”和“嗨,Steve,我最近尝试了你的建议,但我仍然有相同的错误。我更新了我的初始帖子,我是否包含了true类。你的编译命令是什么?你是否同时编译main.cpp和featurevector.cpp?(或者如果分别编译,则编译main.o和featurevector.o)@史蒂夫,我正在分别编译它们。@Javier:那么当你链接它们时,你是否在命令中同时指定了两个对象文件?这将为我编译、链接和运行(即使是单独编译)如果我将流操作符的显式实例化放在featurevector-impl.cpp.Hi-Steve中,我基本上有一个包含featurevector类的小库(因此,我在这里生成featurevector.o)。然后,当我编译main时,我链接库,比如:g++-O3-Wall main.cpp-o../bin/main-I../inc-L../lib-lmylib-lm谢谢你的建议!但我需要使用类是有原因的。@Javier:'struct'声明了一个类。@Roger:谢谢,我不知道。我的方法中的问题在哪里,我不明白写了什么g、 @Javier:我不确定问题到底是什么,因为问题已经更新了更多的信息,我不愿意假设知道你在使用什么,但就目前的问题文本而言,这些函数的定义已经被注释掉了。-我的回答是,你把这个问题弄得太复杂了,并展示了如何使用无效。
template class FeatureVector<int>;
//template istream & operator >> <>(istream &, FeatureVector<int> &);
//template ostream & operator << <>(ostream &, const FeatureVector<int> &);
#ifndef MY_LIB_H
#define MY_LIB_H
#include <featurevector.h>
#endif
#include <mylib.h>
#include <common.h>

int main(){
    FeatureVector<int> pFeat(10);
    cin >> (pFeat);
    cout << (pFeat);

    return (0);
}
INC=./inc
SRC=./src
LIB=./lib
OBJ=./obj

CC=g++
CFLAGS=-O3 -Wall

mylib: $(LIB)/mylib.a
echo "mylib was created!..."

$(LIB)/mylib.a: \
$(OBJ)/featurevector.o 
    ar csr $(LIB)/mylib.a \
$(OBJ)/featurevector.o 

$(OBJ)/featurevector.o: $(SRC)/featurevector.cpp
    $(CC) -c $(CFLAGS) $(SRC)/featurevector.cpp -I$(INC)  \
    -o $(OBJ)/featurevector.o

clean:
    rm -rf $(LIB)/*.a
    rm -rf $(OBJ)/*.o
LIB=../lib
INC=../inc
OBJ=../obj
BIN=../bin

CC=g++
CFLAGS=-O3 -Wall
LFLAGS=-lmylib -lm

$@.cpp: $(LIB)/mylib.a $@.cpp
    cd ..; make; cd app;
$(CC) $(CFLAGS) $@.cpp -o $(BIN)/$@ -I$(INC) -L$(LIB) $(LFLAGS)

clean:
    rm -rf $(BIN)/*
#include <iostream>
using namespace std;

template < class T >
class myClass;

template < class T >
ostream & operator << (ostream &, const myClass<T> &);

template < class T >
class myClass{
    public:
        myClass(int) {}
        friend ostream & operator << <>(ostream &, const myClass<T> &);

    private:
        T m_Data;
};

template < class T >
ostream & operator << (ostream & out, const myClass<T> & refClass){
    out << refClass.m_Data << endl;
    return (out);
}

myClass<int>;
myClass<float>;



int main(int argc, char **argv){
    myClass<int> test(5);
    cout << test;
    return 0;
}
template class FeatureVector<int>;
template istream & operator >> <>(istream &, FeatureVector<int> &);
template<class FEAT_TYPE>
struct FeatureVector {
  FeatureVector(int = 0);

  friend std::istream& operator>>(std::istream &s, FeatureVector &x) {
    for(int d = 0; d < x.getDim(); d++) {
      s >> x.m_pFeat[d];
    }
    return s;
  }

  friend std::ostream& operator<<(std::ostream &s, FeatureVector const &x) {
    // since you're terminating with " " rather than separating:
    copy(x.m_pFeat, x.m_pFeat + x.getDim(), ostream_iterator<FEAT_TYPE>(s, " "));
    s << endl;
    return s;
  }

  //...
#include <iostream>
using std::ostream;

template <typename T>
class A {
  public:
    ...

    template <typename J> // <-- CAUTION!
    friend ostream &operator<<(ostream &output, const A<J> &a);
};
#include "class.h"
...
template <typename T>
ostream &operator<<(ostream &output, const A<T> &a) {
  // Your implementation
  return output;
}

...
template ostream &operator<<(ostream &output, const A<int> &a);
template ostream &operator<<(ostream &output, const A<float> &a);