gpt4 book ai didi

c++ - 显式实例化泛型结构的泛型成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:59:56 25 4
gpt4 key购买 nike

我有一个带有模板参数的结构,Stream。在该结构中,有一个具有自己的模板参数 Type 的函数。

如果我尝试强制生成和调用该函数的特定实例,它可以正常工作,如果我处于结构的确切类型已知的上下文中。如果没有,我会得到一个编译错误。这感觉就像我缺少 typename 的情况,但没有嵌套类型。我怀疑我遗漏了一些基本的东西,但我一直盯着这段代码看这么久,我看到的都是红头发,坦率地说,编写使用模板的代码从来都不是我的强项。

以下是我能想到的最简单的例子来说明这个问题。

#include <iostream>

template<typename Stream>
struct Printer {
Stream& str;
Printer(Stream& str_) : str(str_) { }

template<typename Type>
Stream& Exec(const Type& t) {
return str << t << std::endl;
}
};

template<typename Stream, typename Type>
void Test1(Stream& str, const Type& t) {
Printer<Stream> out = Printer<Stream>(str);
/****** vvv This is the line the compiler doesn't like vvv ******/
out.Exec<bool>(t);
/****** ^^^ That is the line the compiler doesn't like ^^^ ******/
}

template<typename Type>
void Test2(const Type& t) {
Printer<std::ostream> out = Printer<std::ostream>(std::cout);
out.Exec<bool>(t);
}

template<typename Stream, typename Type>
void Test3(Stream& str, const Type& t) {
Printer<Stream> out = Printer<Stream>(str);
out.Exec(t);
}

int main() {
Test2(5);
Test3(std::cout, 5);
return 0;
}

如其所写,gcc-4.4 提供以下内容:

test.cpp: In function 'void Test1(Stream&, const Type&)':
test.cpp:22: error: expected primary-expression before 'bool'
test.cpp:22: error: expected ';' before 'bool'

Test2Test3 都编译得很干净,如果我注释掉 Test1 程序就会执行,我得到“1 5”预计。所以看起来我想做的事情的想法没有错,但是我在实现中搞砸了一些事情。

如果有人可以阐明我忽略的内容,将不胜感激。

最佳答案

你需要告诉编译器依赖名称Printer<Stream>::Exec是一个模板:

out.template Exec<bool>(t);

typename的原理相同,只是在这种情况下,有问题的名称不是类型,而是模板。

关于c++ - 显式实例化泛型结构的泛型成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2541289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com