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++ (g+;+;4.7.1)用等效类typedef替换显式类型名无法编译_C++_Templates_C++11_G++ - Fatal编程技术网

C++ (g+;+;4.7.1)用等效类typedef替换显式类型名无法编译

C++ (g+;+;4.7.1)用等效类typedef替换显式类型名无法编译,c++,templates,c++11,g++,C++,Templates,C++11,G++,我正在尝试创建一个模板函数,它接受一个iterable和一个function,这样传递的函数将隐式地转换为相应类型的std::function(从而允许它与完整函数和lambda一起使用) 代码如下: #include <iostream> #include <vector> #include <algorithm> #include <typeinfo> template<typename T> void bar(const T

我正在尝试创建一个模板函数,它接受一个iterable和一个function,这样传递的函数将隐式地转换为相应类型的
std::function
(从而允许它与完整函数和lambda一起使用)

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <typeinfo>


template<typename T>
void bar(const T & base, std::function<bool(int)> f) // works
//void bar(const T & base, std::function<bool(typename T::iterator::value_type)> f) // fails to compile
{
    std::cout << ((typeid(std::function<bool(int)>) == typeid(std::function<bool(typename T::iterator::value_type)>))?"identical":"distinct") << std::endl;
}

bool filter(int x) { return x%2==0; }

int main() { bar(std::vector<int> {0, 1}, filter); }

我应该注意到,未修改的版本成功地使用了Xcode(设置了适当的选项),但是如果可能的话,我更喜欢使用g++而不是clang。是我做错了什么,还是这是g++中已知的错误?

对不起,但是错误在您的代码中。这相当于:

template<typename T> struct S { template<typename U> S(const U &); };
template<typename T> void bar(T, S<T>);
int main() { bar(5, 6); }

指针函数需要第二个重载——然后它将编译。隐式转换到
std::function
不起作用:

void bar(const T & base, bool(*f)(typename T::value_type)){
    std::cout << "ptr func\n";
}

然后,编译器将忽略这些T以进行类型推断。

嗯,谢谢。我已经实现了另一种(相当可怕的)解决方法,一种不要求调用方引用或派生第二种类型的方法。对于那些不想同时阅读这本书的人来说,这本书本质上是在讨好别人。
template<typename T>
void bar_impl(const T & base, std::function<bool(typename T::iterator::value_type)> f)
{
    std::cout << ((typeid(std::function<bool(int)>) == typeid(std::function<bool(typename T::iterator::value_type)>))?"identical":"distinct") << std::endl;
}

template<typename T, typename F>
void bar(const T & base, F &&f)
{
    bar_impl<T>(base, std::forward<F>(f));
}
void bar(const T & base, bool(*f)(typename T::value_type)){
    std::cout << "ptr func\n";
}
template<class T> struct identity{ typedef T type; };