我有一个类模板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) 我的代码出了什么问题?
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 …
正如标题所述,我遇到了臭名昭著的unresolved external symbol链接器问题。
我已经移动了.h文件中的所有内容。模板类不再在.h和.cpp文件之间拆分。
我已将它们包含在主文件中。我已经三重四重检查了定义是否存在(显然)。
我的文件如下:
Utils.h:
只是一个漂亮的 coutvector和valarray。测试和工作。
#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)