相关疑难解决方法(0)

声明模板类的模板友元函数

我有一个类模板Obj和一个函数模板make_obj. Obj有一个private构造函数定义,它引用其绑定的模板类型.

template <typename T>
class Obj {
  private:
    T& t;
    Obj(T& t)
        : t{t}
    { }
};

template <typename T>
Obj<T> make_obj(T& t) { 
    return {t};
}
Run Code Online (Sandbox Code Playgroud)

我想要的是声明make_obj函数a,friend以便它可以创建Obj,但没有其他人可以(除了通过复制ctor).


我已经尝试了几个朋友声明,包括

friend Obj make_obj(T&);
Run Code Online (Sandbox Code Playgroud)

template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
Run Code Online (Sandbox Code Playgroud)

后者是完成该类make_obj朋友的所有模板实例化的不太理想的尝试Obj.但是在这两种情况下我都会得到同样的错误:

error: calling a private constructor of class 'Obj<char const[6]>'
    return {t};
           ^

note: in instantiation of function template specialization
      'make_obj<const …
Run Code Online (Sandbox Code Playgroud)

c++ templates friend c++11

31
推荐指数
2
解决办法
2万
查看次数

C++模板的朋友操作符重载

我的代码出了什么问题?

template<int E, int F>
class Float
{
 friend Float<E, F> operator+ (const Float<E, F> &lhs, const Float<E, F> &rhs);
};
Run Code Online (Sandbox Code Playgroud)

G ++只是警告:

float.h:7: warning: friend declaration ‘Float<E, F> operator+(const Float<E, F>&, const Float<E, F>&)’ declares a non-template function

float.h:7: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

我试着add <> after the function name here在警告说明中提到,但是g ++给了我一个错误.

我用clang …

c++ templates operator-overloading friend

11
推荐指数
1
解决办法
2万
查看次数

类模板上一个特定函数的未解析外部符号

正如标题所述,我遇到了臭名昭著的unresolved external symbol链接器问题。

我已经移动了.h文件中的所有内容。模板类不再在.h.cpp文件之间拆分。

我已将它们包含在主文件中。我已经三重四重检查了定义是否存在(显然)。

我的文件如下:

Utils.h

只是一个漂亮的 coutvectorvalarray。测试和工作。

#pragma once

#include <vector>
#include <valarray>
#include <ostream>

using std::vector;
using std::valarray;
using std::ostream;


template <typename ValueType>
ostream& operator<< (ostream&, vector<ValueType>);

template <typename ValueType>
ostream& operator<< (ostream&, valarray<ValueType>);


template <typename ValueType>
ostream& operator<< (ostream& out, vector<ValueType> v)
{
    out << "Vec[";
    for (int i = 0; i < v.size() - 1; i++)
        out << v[i] << ", "; …
Run Code Online (Sandbox Code Playgroud)

c++ linker templates visual-c++ c++11

-3
推荐指数
1
解决办法
133
查看次数