我试图在一个模板化的类中获得一个友元函数来编译,但是错误信息和警告我不理解。我已经对这个问题进行了论证。我得到的错误是:
prog.cpp:8:57:错误:非类、非变量部分专门化C运算符(const B
掠夺。cpp:15:59:警告:友元声明'C运算符(常量B
prog.cpp:15:59:注意:(如果这不是您想要的,请确保函数模板已经声明并添加
#include <iostream>
using namespace std;
template<typename A, typename B>
class C;
template<typename A, typename B>
C<A, B> operator+<A, B>(const B& lhs, const C<A, B>& rhs);
template<typename A, typename B>
struct C
{
A val_;
C operator+(const C& other) const;
friend C<A, B> operator+(const B& lhs, const C<A, B>& rhs);
};
template<typename A, typename B>
C<A, B> C<A, B>::operator+(const C<A, B>& other) const
{
C<A, B> c;
c.val_ = this->val_ + other.val_;
return c;
}
template<typename A, typename B>
C<A, B> operator+(const B& lhs, const C<A, B>& rhs)
{
C<A, B> c;
c.val_ = lhs + rhs.val_;
return c;
}
int main()
{
C<string, char> c0,c1;
c0.val_ = " C0 ";
c1.val_ = " C1 ";
cout << "Stuct:" << (c0 + c1).val_ << '\n';
cout << "Friend:" << ('~' + c1).val_ << endl;
return 0;
}
本声明:
template<typename A, typename B>
C<A, B> operator+<A, B>(const B& lhs, const C<A, B>& rhs);
...是错误的,因为<代码>
此声明应为:
template<typename A, typename B>
C<A, B> operator+ (const B& lhs, const C<A, B>& rhs);
然后,您应该在朋友
声明中显式指定您想要一个专用版本,方法是编写:
friend C<A,B> operator+<>(const B& lhs, const C<A,B>& rhs);
您需要将其放在<code>运算符</code>之前,否则编译器会认为这是非模板函数的特化。
无论如何,如果你没有真正的理由把你的代码放在C
类之外,我会去@Jarod42解决方案。
您的整个代码应该如下所示:
// Declaration of struct C with delayed definition
template <typename A, typename B>
struct C;
// Initial declaration of templated operator+
template <typename A, typename B>
C<A, B> operator+ (const B&, const C<A, B>&);
// Definition of C
template <typename A, typename B>
struct C {
friend C operator+<> (const B&, const C&);
// This must be AFTER the templated operator+
C operator+ (const C&) const;
};
template<typename A, typename B>
C<A, B> C<A, B>::operator+(const C<A, B>& other) const {
}
template<typename A, typename B>
C<A, B> operator+(const B& lhs, const C<A, B>& rhs) {
}
最简单的方法是在类中内联代码:
template <typename A, typename B>
struct C
{
A val_;
C operator+(const C& other) const
{
C c;
c.val_ = this->val_ + other.val_;
return c;
}
friend C operator+ (const B& lhs, const C& rhs)
{
C c;
c.val_ = lhs + rhs.val_;
return c;
}
};
演示
类中没有内联的代码,需要注意前置声明顺序,奇怪的语法
template <typename A, typename B> struct C;
template <typename A, typename B>
C<A, B> operator+ (const B& lhs, const C<A, B>& rhs);
template <typename A, typename B>
struct C
{
A val_;
friend C<A, B> operator+<> (const B& lhs, const C<A, B>& rhs);
C operator+(const C& other) const;
};
template <typename A, typename B>
C<A, B> operator+ (const B& lhs, const C<A, B>& rhs)
{
C<A, B> c;
c.val_ = lhs + rhs.val_;
return c;
}
template <typename A, typename B>
C<A, B> C::operator+(const C<A, B>& other) const
{
C<A, B> c;
c.val_ = this->val_ + other.val_;
return c;
}
演示
我是新使用模板。作为标题,我有一个非模板类(Obj和ObjBase)和一个模板类pitem。我想让pItem::RefValue()访问obj中的私有成员。 我想下面的行得通: 它不: 错误C2248:“obj::GetValue”:无法访问类“obj”中声明的私有成员 注意:请参阅对正在编译的函数模板实例化“int PItem::GetValue(void)”的引用 编译器投诉:
我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非
是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错
我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译
我有以下示例类<code>Foo</code>和嵌套类<code<Bar</code<,所有内容都是<code>constexpr</code>: 我想测试调用<code>Foo::DoTheThing</code>返回1: 海湾合作委员会和Clang都在这里抱怨,但MSVC没有 GCC表示: 错误: ,或者如果我将< code>Bar的定义移到< code>Foo之外,我可以让GCC和Clang
这里有一个最小的例子来说明我遇到的问题。 模板成员显式专用于基类中的。模板的代码是显式生成的,并在成员中调用。 我发现的第一个问题是: 该错误是由于在main中调用造成的。可以通过调用来避免这种情况。为什么在的实例中显然是不可见的?