可变模板-编译错误
variadic templates - compile error
你能帮我修复下面代码中的编译错误吗?
#include <sstream>
#include <iostream>
using namespace std;
template<typename T, typename ...P>
class Mystrcat{
public:
Mystrcat(T t, P... p){init(t,p...);}
ostringstream & get(){return o;}
private:
ostringstream o;
void init(){}
void init(T t, P... p);
};
template<typename T, typename ...P>
void Mystrcat<T,P...>::init(T t, P ...p){
o << t;
if (sizeof...(p)) init(p...);
}
int main(){
Mystrcat<char*,char *> m("Amma","Namasivayah");
cout << m.get().str();
}
我得到错误,没有匹配的函数调用
‘Mystrcat<char*, char*>::init(char*&)’
注:候选人为:
void Mystrcat<T, P>::init() [with T = char*, P = char*]
void Mystrcat<T, P>::init(T, P ...) [with T = char*, P = char*]
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
谢谢苏雷什
您得到这个错误是因为没有办法将您的p
解包到init
函数中。在您的实例化Mystrcat<char*, char *>
中,解包P...
将在类型中产生一个东西:char*
,它没有具有该签名的init
(实例化版本将具有void init()
和void init(char*, char*)
,而您正在尝试调用init(char*)
)。
实际上,你的模板是不可能实例化的,因为init
总是比void Mystrcat<T,P...>::init(T t, P ...p)
多接受一个参数。如果您更改定义以调用已定义的内容:
template<typename T, typename ...P>
void Mystrcat<T,P...>::init(T t, P ...p){
o << t;
if (sizeof...(p)) init(t, p...);
}
那么这将工作(至少在g++-4.5.2)。
EDIT:我想这就是你实际要找的:
#include <sstream>
#include <iostream>
class MyCollector
{
public:
template <typename... T>
explicit MyCollector(const T&... args)
{
init(args...);
}
std::string str()
{
return _stream.str();
}
private:
void init()
{ }
template <typename First, typename... Rest>
void init(const First& first, const Rest&... rest)
{
_stream << first;
init(rest...);
}
std::ostringstream _stream;
};
int main()
{
MyCollector collector("Whatever ", "stuff like ", 2, " or ", 3.14, "n");
std::cout << collector.str();
return 0;
}
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?