Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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_C++11_Language Lawyer_Emscripten - Fatal编程技术网

C++ 使用模板参数时的默认模板参数

C++ 使用模板参数时的默认模板参数,c++,templates,c++11,language-lawyer,emscripten,C++,Templates,C++11,Language Lawyer,Emscripten,以下代码在C++11标准下使用gcc 5.2、gcc 4.9和clang 3.7进行编译: template <typename T, typename U, template<typename...> class M> U * find_item(M<T, U> & m, const T & t) { auto it = m.find(t); if (it != m.end()) { return &it->second

以下代码在C++11标准下使用gcc 5.2、gcc 4.9和clang 3.7进行编译:

template <typename T, typename U, template<typename...> class M>
U * find_item(M<T, U> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

template <typename T, typename U, template<typename...> class M>
const U * find_item(const M<T, U> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

#include <map>
#include <unordered_map>
#include <string>
#include <iostream>

int main() {
  std::map<std::string, int> foo;

  foo["asdf"] = 5;
  if (find_item(foo, std::string{"bar"})) { std::cerr << "hmm\n"; }
}
这有点奇怪,因为我的emscripten声称基于clang-3.7。无论如何,在实例化
find\u项
模板时,似乎很难推导默认参数

如果代码按以下方式更改,则所有编译器似乎都对其感到满意:

template <typename T, typename U, template<typename...> class M, typename... dummy>
U * find_item(M<T, U, dummy...> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

template <typename T, typename U, template<typename...> class M, typename... dummy>
const U * find_item(const M<T, U, dummy...> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

#include <map>
#include <unordered_map>
#include <string>
#include <iostream>

int main() {
  std::map<std::string, int> foo;

  foo["asdf"] = 5;
  if (find_item(foo, std::string{"bar"})) { std::cerr << "hmm\n"; }
}
模板
U*查找项目(M&M、常量T&T){
自动it=m.find(t);
如果(it!=m.end()){return&it->second;}
返回空ptr;
}
模板
常量U*查找项目(常量M&M、常量T&T){
自动it=m.find(t);
如果(it!=m.end()){return&it->second;}
返回空ptr;
}
#包括
#包括
#包括
#包括
int main(){
std::mapfoo;
foo[“asdf”]=5;

如果(find_item(foo,std::string{“bar”})){std::cerr我遇到了这个问题,发现我不需要伪模板参数,将模板模板指定为variadic就足够了(这在clang 3.6上):

模板
U*查找项目(M&M、常量T&T){
自动it=m.find(t);
如果(it!=m.end()){return&it->second;}
返回空ptr;
}
模板
常量U*查找项目(常量M&M、常量T&T){
自动it=m.find(t);
如果(it!=m.end()){return&it->second;}
返回空ptr;
}
这是。我想你是对的——我想这意味着这里的定义不够明确?我会接受这个答案。MSVC有
template <typename T, typename U, template<typename...> class M, typename... dummy>
U * find_item(M<T, U, dummy...> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

template <typename T, typename U, template<typename...> class M, typename... dummy>
const U * find_item(const M<T, U, dummy...> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

#include <map>
#include <unordered_map>
#include <string>
#include <iostream>

int main() {
  std::map<std::string, int> foo;

  foo["asdf"] = 5;
  if (find_item(foo, std::string{"bar"})) { std::cerr << "hmm\n"; }
}
template <typename T, typename U, template<typename...> class M>
U * find_item(M<T, U> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}

template <typename T, typename U, template<typename...> class M>
const U * find_item(const M<T, U> & m, const T & t) {
  auto it = m.find(t);
  if (it != m.end()) { return &it->second; }
  return nullptr;
}