编译器看不到函数,但可以看到以相同方式使用的所有其他函数
Compiler doesn't see function, thougth all other functions, used in the same way, are seen
我有三个文件:matrix.cpp main.cpp matrix.hpp。
在 matrix.hpp 中声明了一个函数 str_matrix(const char*),它的文本在 matrix.cpp 中。在 main.cpp 我想使用这个功能。
在 matrix.hpp:
class matrix {
...
friend matrix str_matrix(const char*);
在matrix.cpp中:
#include "matrix.hpp"
#include <iostream>
#include <cstdlib>
#include <cstdio>
...
matrix str_matrix(const char* a) {
...}
在main.cpp中:
#include <iostream>
#include <fstream>
#include "matrix.hpp"
#include <cstdlib>
#include <cstdio>
...
matrix m1(str_matrix ("{1}"));
但是我有一个错误:
nirvana@lpt00:~/cpp/matrix$ g++ main.cpp matrix.cpp
main.cpp: In function ‘int main()’:
main.cpp:12:30: error: ‘str_matrix’ was not declared in this scope
matrix m1(str_matrix ("{1}"));
^
我应该如何处理它?
我假设您遇到的问题与这个较小的示例中的问题相同:
class matrix {
public:
friend matrix str_matrix(const char*);
};
matrix m1(str_matrix ("{1}"));
// error: 'str_matrix' was not declared in this scope
这里的问题是 friend
声明不会使声明的名称可用于在封闭范围内查找。该名称仅可用于 argument-dependent 查找,但 ADL 未在此处找到该函数,因为参数的类型为 char *
,而不是 matrix
.
要解决此问题,您还需要包含一个 non-friend 声明,例如:
matrix str_matrix(const char *);
在 header 中的 class 定义之后。
除了 使用当前的 c++ 标准之外,您还可以内联 friend
函数定义:
class matrix {
...
friend matrix str_matrix(const char*) {
// Provide the friend unction definition here
}
};
我有三个文件:matrix.cpp main.cpp matrix.hpp。 在 matrix.hpp 中声明了一个函数 str_matrix(const char*),它的文本在 matrix.cpp 中。在 main.cpp 我想使用这个功能。 在 matrix.hpp:
class matrix {
...
friend matrix str_matrix(const char*);
在matrix.cpp中:
#include "matrix.hpp"
#include <iostream>
#include <cstdlib>
#include <cstdio>
...
matrix str_matrix(const char* a) {
...}
在main.cpp中:
#include <iostream>
#include <fstream>
#include "matrix.hpp"
#include <cstdlib>
#include <cstdio>
...
matrix m1(str_matrix ("{1}"));
但是我有一个错误:
nirvana@lpt00:~/cpp/matrix$ g++ main.cpp matrix.cpp
main.cpp: In function ‘int main()’:
main.cpp:12:30: error: ‘str_matrix’ was not declared in this scope
matrix m1(str_matrix ("{1}"));
^
我应该如何处理它?
我假设您遇到的问题与这个较小的示例中的问题相同:
class matrix {
public:
friend matrix str_matrix(const char*);
};
matrix m1(str_matrix ("{1}"));
// error: 'str_matrix' was not declared in this scope
这里的问题是 friend
声明不会使声明的名称可用于在封闭范围内查找。该名称仅可用于 argument-dependent 查找,但 ADL 未在此处找到该函数,因为参数的类型为 char *
,而不是 matrix
.
要解决此问题,您还需要包含一个 non-friend 声明,例如:
matrix str_matrix(const char *);
在 header 中的 class 定义之后。
除了 friend
函数定义:
class matrix {
...
friend matrix str_matrix(const char*) {
// Provide the friend unction definition here
}
};