Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';模板函数不能编译吗?_C++_Templates_Gcc_Linker_Template Function - Fatal编程技术网

C++ 为什么';模板函数不能编译吗?

C++ 为什么';模板函数不能编译吗?,c++,templates,gcc,linker,template-function,C++,Templates,Gcc,Linker,Template Function,这是一个很短的代码段,不能用g++4.7.1编译(顺便说一下,它也不能用GCC4.6.3编译) #包括 模板 结构Foo { 模板 friend std::ostream&operator您没有实际编写输出运算符您没有实际编写输出运算符与模板的友谊可能有点复杂…让我们看看您的代码的作用: template<typename T> struct Foo { template<typename U> friend std::ostream& opera

这是一个很短的代码段,不能用g++4.7.1编译(顺便说一下,它也不能用GCC4.6.3编译)

#包括
模板
结构Foo
{
模板

friend std::ostream&operator您没有实际编写输出运算符您没有实际编写输出运算符与模板的友谊可能有点复杂…让我们看看您的代码的作用:

template<typename T>
struct Foo {
    template<typename U>
    friend std::ostream& operator<<(Foo&, U&);  // [1]
};
template<typename T, typename U>
std::ostream& operator<<(Foo<T> foo, U& u) {    // [2]
    std::cout << u;
    return std::cout;
}
但该函数在任何地方都不存在,您在[2]中提供的模板包含两个参数:

template<typename T, typename U>
std::ostream& operator<<(Foo<T> foo, U& u);
它声明了一个包含两个参数的模板(在这里,
W
U
都是未绑定的),并在名称空间级别匹配您的定义


另一个选项是在类模板定义中定义friend函数,在这种情况下,您可以维护原始签名。有关不同备选方案的更多信息,请查看另一个

与模板的友谊可能有点复杂…让我们看看您的代码的作用:

template<typename T>
struct Foo {
    template<typename U>
    friend std::ostream& operator<<(Foo&, U&);  // [1]
};
template<typename T, typename U>
std::ostream& operator<<(Foo<T> foo, U& u) {    // [2]
    std::cout << u;
    return std::cout;
}
但该函数在任何地方都不存在,您在[2]中提供的模板包含两个参数:

template<typename T, typename U>
std::ostream& operator<<(Foo<T> foo, U& u);
它声明了一个包含两个参数的模板(在这里,
W
U
都是未绑定的),并在名称空间级别匹配您的定义

另一个选项是在类模板定义中定义friend函数,在这种情况下,您可以维护原始签名

template<typename W, typename U>
friend std::ostream& operator<<(Foo<W> foo, U& u);